我有一个动态网页,我需要IF在另一个javascript文件中导入一个外部JS文件(在一个条件下).
我试图寻找一个可行的解决方案,但它没有用.
我已经尝试使用JS文件加载到DOM,document.createElement()但它也没有用.显然,Js已加载到DOM中,但在当前的JS文件中无法访问.
jQuery中的解决方案也没问题
我一直在使用这个函数将onload处理程序附加到脚本标记,它似乎是互联网上推荐的方式.
然而,如果页面已经加载(在8中测试),它在Internet Explorer中不起作用.您可以看到它在普通浏览器中有效(加载脚本时会触发警报).
我错过了什么吗?
谢谢
有没有办法像同步XMLHttpRequest一样以同步方式加载和执行javascript文件?
我目前正在使用同步XMLHttpRequest,然后使用eval,但调试该代码非常困难......
谢谢你的帮助!
更新
我现在试过这个:
的test.html
<html>
<head>
<script type="text/javascript">
var s = document.createElement("script");
s.setAttribute("src","script.js");
document.head.appendChild(s);
console.log("done");
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
的script.js
console.log("Hi");
Run Code Online (Sandbox Code Playgroud)
输出:完成嗨
所以它没有同步执行.任何想出"嗨"的想法首先出现?
更新2 其他示例
test.html(脚本标记内的代码)
var s = document.createElement("script");
s.setAttribute("src","script.js");
document.head.appendChild(s);
SayHi();
Run Code Online (Sandbox Code Playgroud)
的script.js
function SayHi(){
console.log("hi");
}
Run Code Online (Sandbox Code Playgroud)
输出:未捕获的ReferenceError:未定义SayHi
即将从这个答案,上面写着:
你应该在事件之后设置
src属性f.ex:onloadRun Code Online (Sandbox Code Playgroud)el.onload = function() { //... el.src = script;您还应该在附加
onload事件之前将脚本附加到DOM :Run Code Online (Sandbox Code Playgroud)$body.append(el); el.onload = function() { //... el.src = script;请记住,您需要检查
readystateIE支持.如果您使用的是jQuery,还可以尝试以下getScript()方法:http://api.jquery.com/jQuery.getScript/
我怀疑相信这将是问题的正确答案.
那么,设置onload处理程序的顺序是src如此重要吗?我认为它们是由浏览器立即评估的,所以我认为之间没有区别:
el.onload = function() { //...
el.src = script;
Run Code Online (Sandbox Code Playgroud)
和
el.src = script;
el.onload = function() { //...
Run Code Online (Sandbox Code Playgroud)
我对吗?
我有一个HTML注入到已加载的DOM的问题,其中在下载脚本文件后加载内联javascript.据我所知,这不应该是异步的,并且内联脚本应该在脚本文件之后执行.如果域名与调用页面相同,则此方法有效,但使用CDN甚至子域也可以执行相同的操作.我是否应该做些什么来改变我如何称呼这些?我发誓这是有效的,因为我有一个多星期的CDN,但也许我从未发现过这个问题.
安慰
Loading Inline Script
VM1400:3 Uncaught TypeError: Cannot read property 'init' of undefined(anonymous function)
app.members.event.js?v=204&_=1453644424985:5 Loading Script File
app.members.event.js?v=204&_=1453644424985:71 Finished Script File
Run Code Online (Sandbox Code Playgroud)
使用Javascript
<script type="text/javascript" src="https://test.azureedge.net/Areas/Directors/scripts/app.members.event.js?v=204"></script>
<script type="text/javascript">
console.log('Loading Inline Script');
app.viewModel.members.event.init();
console.log('Finished Inline Script');
Run Code Online (Sandbox Code Playgroud) 我正在尝试用javascript模拟'enter'按键以实现自动化.
var script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-1.10.2.min.js';
script.type = 'text/javascript';
document.body.appendChild(script);
var e = jQuery.Event("keypress");
e.which = 13; //choose the one you want
e.keyCode = 13;
Run Code Online (Sandbox Code Playgroud)
这是用于设置键事件的代码(我也尝试过keydown和keyup).
在搜索Google时,这似乎不起作用.如果我输入一些文本并在输入字段上触发事件则$("[name=q]").trigger(e)没有任何反应.
我正在使用谷歌来测试模拟"正确"的输入事件.我希望使用js来自动化skype web客户端.
有谁知道是否可以使用javascript模拟实际的输入按键?我已经看到了Selenide的pressEnter()作品,但它使用的是webdriver所以也许它不相关.
我也尝试过本机js事件触发
var dispatchKeyboardEvent = function(target, initKeyboradEvent_args) {
var e = document.createEvent("KeyboardEvents");
e.initKeyboardEvent.apply(e, Array.prototype.slice.call(arguments, 1));
target.dispatchEvent(e);
};
dispatchKeyboardEvent($("[name=q]"), 'keypress', true, true, null, 'h', 13, '');
Run Code Online (Sandbox Code Playgroud)
sidenote我知道可以通过调用元素上的.submit()来提交查询,但这不是我所追求的.
最初,我将以下代码静态保存在 Index.html 中并且它可以工作。
<script src="/le.min.js"></script>
<script>
LE.init({
token: 'token',
region: 'x'
});
</script>
Run Code Online (Sandbox Code Playgroud)
由于我的要求,我决定动态加载我编写的示例代码。
//loads librabry
jsScript = document.createElement('script');
jsScript.src = `/le.min.js`;
document.head[0].appendChild(jsScript);
//loads initialise function in the script
script = document.createElement('script');
script.innerHtml= `LE.init({
token: '${TOKEN}',
region: 'US'
});`
document.head[0].appendChild(script);
Run Code Online (Sandbox Code Playgroud)
两者都正确附加,但它抛出错误LE is not defined。如果我附加初始化函数脚本,因为type=text没有错误,但不会发生初始化。我怎样才能做到这一点?
我正在尝试使用MathJax在我的Angular 2应用程序中显示方程式.我的应用程序中只有一小部分实际需要此功能,因此我不希望所有用户都必须下载所需的3-400kb.
我最初的想法是import "mathjax"在我的组件中,因此只有在创建组件时才会加载库.但是,我从我之前的问题中了解到MathJax与其他人不能很好地兼容,因为它使用自己的自定义模块加载器.
我当前的设置script从我的加载,index.html但这意味着当只有一小部分用户需要此组件时,每个人都会下载它
<script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=AM_SVG"></script>
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法Angular 2让我的组件在ngOnInit()钩子中下载脚本并在DOM中执行回调?诸如(伪代码)之类的东西:
ngOnInit(){
//download script, add to DOM
fetch('https://...MathJax.js').then(addToDom).then(this.onMathJaxLoaded);
}
onMathJaxLoaded(){
// Run math renderer
MathJax.Hub.Queue("Typeset",...);
}
Run Code Online (Sandbox Code Playgroud) javascript ×8
angular ×2
jquery ×2
asynchronous ×1
cdn ×1
dom ×1
events ×1
html ×1
load ×1
mathjax ×1
onload ×1
synchronous ×1