动态加载 JavaScript 具有数据属性的小部件
Dynamically loading JavaScript widget with data attributes
目前我有一个小部件,您可以使用以下内容将其插入页面的某处
<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>
使用jQuery load()喜欢
$(window).load(function() {
$('<script/>').attr({
'src': 'http://domain.com/public/jsonp/widget.js',
'data-id': 'LFKkv',
'data-width': '240'
}).appendTo('body')
});
能否将小部件包装在一个函数中,并使用事件侦听器?
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 );
});
尝试将 options
对象传递给加载 widget,js
的 "init" 函数,在 "init" 的 success
回调中在小部件上设置 options
函数
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)
});
好的,你应该试试这个:
$.getScript("http://domain.com/public/jsonp/widget.js?data-id=LFKkv&data-width=240", function(data){ ... })
这就是您在 url 中传递参数的方式。你输入 ?
然后开始输入 data=value&data2=value2
它必须被正确地 html 编码。
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
目前我有一个小部件,您可以使用以下内容将其插入页面的某处
<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>
使用jQuery load()喜欢
$(window).load(function() {
$('<script/>').attr({
'src': 'http://domain.com/public/jsonp/widget.js',
'data-id': 'LFKkv',
'data-width': '240'
}).appendTo('body')
});
能否将小部件包装在一个函数中,并使用事件侦听器?
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 );
});
尝试将 options
对象传递给加载 widget,js
的 "init" 函数,在 "init" 的 success
回调中在小部件上设置 options
函数
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)
});
好的,你应该试试这个:
$.getScript("http://domain.com/public/jsonp/widget.js?data-id=LFKkv&data-width=240", function(data){ ... })
这就是您在 url 中传递参数的方式。你输入 ?
然后开始输入 data=value&data2=value2
它必须被正确地 html 编码。
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