0

在我们的网站上,<body>标签包含各种data-*="*"属性:

<body data-someData="someValue" data-someOtherData="someOtherValue">

我需要在其他页面上获取这些属性的值。因此,我使用 jQuery AJAX$.get来获取页面的 HTML,从而获取这些数据属性。

我当前的脚本:

// The call (used on different pages)
var stock = getProductData('stock', '/some/product/url');

// The "GET" function
function getProductData(type, url) {
    var jqxhr = $.get(url, function( data ) {
        console.log('Data found!');
        var $body = $(data).find('body');
        var val = $body.data('stock');
        console.log('Returning Value: "' + val + '"');
        return val;
    }).done(function(){
        // Request is complete
        console.log('getProductData Finished...');
    }).fail(function(){
        console.error( 'getProductData: ' + type + ' = FAIL / URL: ' + url);
    });
}

所以有什么问题?好吧,$(data).find('body').data('stock');它回来了undefined。我也试过$(data).find('body').attr('data-stock');了,但它返回了同样的东西。

那么,我怎样才能data-someData="someValue"使用返回 body 标签的属性值$.get呢?

上面示例中使用的data-stock属性在我的产品页面上如下所示:

<body data-stock="3">

编辑:不重复:这个问题专门指解析元素的特定属性。我不是在问如何使用 AJAX 返回数据。

4

2 回答 2

0

让我提出一个疯狂的想法……您提供了一个示例 url: var stock = getProductData('stock', '/some/product/url'); 那么文件在同一个域上吗?如果是这样,如何将其加载到隐藏的 iframe 中,然后访问 iframe 的文档属性?但是,如果出于安全原因,内容位于另一个域中,那将不起作用。如果它是同一个域,那么window.frames["framename"].document如果我没记错的话,会给你 IFrame 的内容。

于 2015-04-17T20:18:30.177 回答
0

好的,简短的回答是您无法以<body>这种方式引用标签内的数据属性。因此,您无法使用var productData = $(body).data('someData');. jQuery 使用时显然不注意 body 标签$.ajax- 即使返回的数据被引用为对象。

你可以做的是:

  • 将数据属性移动到隐藏的输入(或 中的任何其他标签)

完成此操作后,您可以在 ajax 请求中引用数据属性。

我在我的 OP 中做错了另一件事……我的 ajax 请求函数不断返回“未定义”。这是因为在 ajax 请求完成之前,该变量已被外部使用。因此,直到使用stock变量return val;的脚本完成使用它之后,它才返回任何内容。

所以,我不得不使用回调并稍微修改我的脚本,但现在一切正常......

所以底线:你不能从 body 标签返回 .data() ,但你可以从 .data 内的其他标签返回。

对于任何需要帮助的人,这是我的脚本(有效)......

召唤

// Needed for use inside AJAX request
var $el = $(this);
var url = $el.data('url');

// List Stock
getProductData('stock', url, function(val) {

  var stock = val;
  var str;
  var cls;

  if ( stock > 0 ) {
    str = stock + ' ' + 'In Stock';
    cls = 'in-stock';
  } else {
    str = 'Out of Stock';
    cls = 'out-of-stock';
  }

  $el.find('label.stock').addClass(cls).text(str);

});

AJAX 请求

// Get data from the product page
function getProductData(type, url, callBack) {

  $.ajax({
    url: url,
    method: 'GET',
    dataType: 'html',
    success: function(data){

      var $data = $(data).find('#product-data');

      var val = $data.data(type);

      return callBack( val );

    },
    error: function(data) {
      console.error( 'getProductData: ' + type + ' = FAIL / URL: ' + url );
    }
  });

}
于 2015-04-22T22:49:38.327 回答