使用数据属性

时间:2015-05-29 13:33:51

标签: javascript jquery ajax jsonp

目前我有一个小部件,您可以使用以下内容在页面上插入

<script src='http://domain.com/public/jsonp/widget.js' data-id='LFKkv' data-width='240'></script>

我想在页面加载后动态加载它,我已经尝试过如下所示的jQuery $.getScript,它失败了:

$.getScript("http://domain.com/public/jsonp/widget.js' data-id='LFKkv' data-width='240'", function(data){ ... })

由于我假设数据属性之间的URL空格。

我可以使用ajax但我不知道如何通过jQuery ajax调用传递数据属性?如何使用完整的数据属性动态加载上述小部件?

修改 包括我的小部件脚本的相关部分,以便您可以看到我的小部件如何抓取数据属性:

    <script>

    var scriptName = "widget.js";
    TGW = window.jQuery.noConflict(true);

    var allScripts = document.getElementsByTagName('script');
    var targetScripts = [];

    for (var i in allScripts) {
        var name = allScripts[i].src
        if(name && name.indexOf(scriptName) > 0)
            targetScripts.push(allScripts[i]);
    }

    scriptTag = targetScripts[targetScripts.length - 1];

    // Getting the data attributes here
    jScript = TGW(scriptTag);
    id = jScript.data("id");
    widget_width = jScript.data("width");
   </script>

5 个答案:

答案 0 :(得分:6)

尝试将options对象传递给“init”函数,该函数加载widget,js,在options回调“init”函数的小部件上设置success

TGW = window.jQuery.noConflict(true);
function initWidget (options) {
  return TGW.ajax({
    url: url,
    dataType: "script"
  })
  .then(function(script) {
    // if `TGW.widgetName()` requires several seconds to load,
    // try adding adding `setTimeout` or `.delay` to wait
    // until `TGW.widgetName` defined before returning `TGW.widgetName`
    return options && TGW.widgetName 
           ? TGW.widgetName(options) 
           : TGW.widgetName(/* defaults?, are `id`, `width` required? */);
  });
};

initWidget({"id":"LFKkv", "width":"240"})
.then(function(widget) {
  console.log(widget)
});

答案 1 :(得分:3)

使用jQuery load()之类的

$(window).load(function() {
    $('<script/>').attr({
        'src': 'http://domain.com/public/jsonp/widget.js',
        'data-id': 'LFKkv',
        'data-width': '240'
    }).appendTo('body')
});

答案 2 :(得分:2)

function loadjscssfile(filename, filetype){
    if (filetype=="js"){ //if filename is a external JavaScript file
        var fileref=document.createElement('script')
        fileref.setAttribute("type","text/javascript")
        fileref.setAttribute("src", filename)
    }
    else if (filetype=="css"){ //if filename is an external CSS file
        var fileref=document.createElement("link")
        fileref.setAttribute("rel", "stylesheet")
        fileref.setAttribute("type", "text/css")
        fileref.setAttribute("href", filename)
    }
    if (typeof fileref!="undefined")
        document.getElementsByTagName("head")[0].appendChild(fileref) }   loadjscssfile("myscript.js", "js") //dynamically load and add this .js file loadjscssfile("javascript.php", "js") //dynamically load "javascript.php" as a JavaScript file loadjscssfile("mystyle.css", "css") ////dynamically load and add this .css file

答案 3 :(得分:1)

好的,你应该试试这个:

$.getScript("http://domain.com/public/jsonp/widget.js?data-id=LFKkv&data-width=240", function(data){ ... })

这是您在网址中传递参数的方法。你放?然后开始放data=value&data2=value2并且必须正确地进行html编码。

答案 4 :(得分:0)

你可以将你的小部件包装在一个函数中,并使用一个事件监听器吗?

window.addEventListener('load', function() {

    var allScripts = document.getElementsByTagName('script');
    var targetScripts = [];

    for (var i = 0; i < allScripts.length; i++) {
        var name = allScripts[i].src;
        if (name && name.indexOf(scriptName) > 0)
            targetScripts.push(allScripts[i]);
    }

    var scriptTag = targetScripts[targetScripts.length - 1];

    console.log( scriptTag.dataset.width );

});