问题就像在这里和网络上的其他人一样 - 如何检查DOM是否已加载Javascript?但这里有一个问题:
<script>标签加载,或者在DOM加载后很久之后通过其他一些Javascript加载.这可以或多或少地可靠地完成并且具有跨浏览器兼容性吗?
补充:让我澄清一下:我正在编写一个独立的.JS文件,可以包含在任意网页中.我想在加载DOM 之后执行代码.但我不知道如何将我的脚本包括在内.可以通过放置<script>标签(在这种情况下,传统onload或DOM准备解决方案将起作用); 或者它可以通过AJAX或其他方式加载,很久以后DOM已经加载(所以前面提到的解决方案永远不会触发).
[ 编辑:我用一个简单的例子来代替原来的,令人困惑的问题来证明这个问题.]
背景
我正在尝试编写一个将在Chrome中运行的用户脚本.这个脚本需要调用一个AlertMe()在usercript之外的JavaScript函数- 这个函数是页面的一部分,包含在服务器端动态生成的变量,所以不能在我的函数中重写这个函数. userscript.
码
页面上的脚本(访问页面):
<script type="text/javascript">
function AlertMe()
{
alert("Function AlertMe was called!");
// then do stuff with strings that were dynamically generated
// on the server so that I can't easily rewrite this into the userscript
}
</script>
Run Code Online (Sandbox Code Playgroud)
我的用户脚本(在Chrome中安装):
function tryAlert()
{
if (typeof AlertMe == "undefined") {
console.log('AlertMe is undefined.');
window.setTimeout(tryAlert, 100);
}
else {
AlertMe();
}
}
tryAlert();
Run Code Online (Sandbox Code Playgroud)
问题
当我试图简单地调用该功能时,Chrome的控制台让我知道AlertMe is not defined.认为这是因为我的用户脚本在加载所有其他脚本之前运行,我曾经setTimeout …
因此,假设我拥有通过CSS隐藏的合法内容,并且我正在使用javascript根据用户点击的内容选择性地显示它.此外,非JavaScript用户可以单击相同的链接并转到显示所请求内容的新页面.没有隐藏的关键字或类似的东西.我有大约15个段落/迷你版块的隐藏内容,可以通过点击链接或使用JavaScript来显示.
搜索引擎会将这些内容标记为隐藏内容中的关键字,从而试图人为地提高我的排名,这种可能性有多大?显然这不是我想要做的 - 所有隐藏的内容都可以通过javascript和非javascript用户查看.不隐藏内容基本上需要重新设计我的网站的整个部分,我想避免.
为了记录,我已经对此进行了一些研究,我认为普遍的共识是,如果你隐藏了合法内容,你就不应该担心.只是想获得一些其他意见,以及是否可以通过点击某些链接查看我隐藏的内容这一事实将有所帮助.
我有一个外部脚本,然后在我的<body>. 根据这个答案,看起来内联脚本在外部脚本之前运行,这是不应该发生的:
如果您没有动态加载脚本或将它们标记为延迟或异步,则脚本将按照页面中遇到的顺序加载。无论是外部脚本还是内联脚本都无关紧要 - 它们按照在页面中遇到的顺序执行。在外部脚本之后的内联脚本被保留,直到它们之前的所有外部脚本都加载并运行。
源代码:https : //stackoverflow.com/a/8996894/114855
这是我的代码:
<script src="https://checkout.stripe.com/checkout.js"></script>
<script>
var handler = StripeCheckout.configure({
key: 'pk_live_HhFqemZFyEUJVorFzYvjUK2j',
token: function(res) {
$('#pay_token').val(res.id);
$('#pay_email').val(res.email)
$('#pay_amount').val(parseFloat($("#amount").val())*100);
$('#pay_description').val($("#description").val());
$('#pay_real').submit();
}
});
/* .. */
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
控制台显示 StripeCheckout 未定义(外部脚本应定义)

这是有道理的,因为网络选项卡显示我的外部请求仍在等待中。但我不确定为什么浏览器没有等待 checkout.js 被获取:

以下是我的代码:
$(document).keypress(function(e){
var s = String.fromCharCode(e.which);
if ( s === "f"){
alert ("its f");
}
else if ( s === "r"){
alert ("its r");
}
});
Run Code Online (Sandbox Code Playgroud)
我想用JavaScript做这个........... !!
我怎样才能做到这一点 ?