【问题标题】:Difference between document.createElement('script') vs jQuery .getScriptdocument.createElement('script') 与 jQuery .getScript 之间的区别
【发布时间】:2011-05-27 22:45:06
【问题描述】:

我在让.getScript 在一些奇怪的情况下工作时遇到了问题。

例如,这仅在需要时才加载脚本。

function twitterSDK() {
    $jQ.getScript('http://platform.twitter.com/widgets.js');
}

function diggShare() {
    $jQ.getScript('http://widgets.digg.com/buttons.js');
}

function buzzShare() {
    $jQ.getScript('http://www.google.com/buzz/api/button.js');
}

但是它似乎不适用于我编写的一些脚本。如果我调用.getScript 来获取我上传到Pastebin (http://pastebin.com/GVFcMJ4P) 的这个JS 文件并调用tweetStream(); 没有任何反应。但是,如果我执行以下操作,它会起作用:

var twitter = document.createElement('script');
twitter.type = 'text/javascript';
twitter.async = true;
twitter.src = '/path-to/tweet.js';
$jQ('.twitter-section').append(twitter);
tweetStream();

我做错了什么?任何帮助都会很棒,谢谢!

附:哪种方法更快或更有效?

注意:我的代码没有托管在 pastebin 上,我只是将我服务器上的 .js 文件的内容上传到该站点,以便于共享。我不是在使用 pastebin 来托管 ;)

【问题讨论】:

  • 当你把/path-to/tweet.js 放在你自己的服务器上是不是一个文件?还是pastebin的网址?当您调用 $.getScript 时,您是否给它相同的 url?
  • 这两个脚本都是我服务器上的.js 文件。我没有从 pastebin 加载任何东西。 :) 使用createElement 方法时它有效,但如果我使用$jQ.getScript('/path-to/tweet.js'); 则它不起作用@

标签: javascript jquery getscript script-tag


【解决方案1】:

jQuery 的$jQ.getScript() 是一个异步调用。因此,如果您在 getScript() 之后立即调用 tweetStream(),它将在脚本到达之前运行。

您可以改为从(或作为)回调调用tweetStream()

$jQ.getScript('/path-to/tweet.js', function() {
    tweetStream();
});

如果您不关心thistweetStream() 中的值,则可以这样做。

$jQ.getScript('/path-to/tweet.js', tweetStream);

【讨论】:

  • 你成功了!非常感谢!
  • 您注意到一个问题,您的代码在 Chrome、IE、Opera 和 Safari 的最新稳定版本中完美运行。但是,您的方法在 Firefox 3.6 中不起作用。它可能每 10 次左右刷新一次。但是,createElement 方法确实适用于所有浏览器。附言我正确引用了this 来解决与此相关的任何问题。这是更新后的代码:pastebin.com/wnP88v7z 我注意到哪个脚本是哪个带有 cmets 的。
  • @Sahas:可能是一个 jQuery 错误。 bug tracker 现在没有为我加载,但可能值得搜索该问题以查看它是否已知。当您说它不起作用时,您的意思是回调函数根本不会触发吗?如果你做一个alert(),它会触发吗?
  • 所以这是奇怪的事情。如果tweet.js 文件中tweetStream() 函数中的第一条语句是alert(),则它适用于所有浏览器,但Firefox 除外。 (即使 IE 也能工作......真的!)所以为了尝试不同的东西,我决定从 tweet.js 文件中调用 tweetStream() 函数,它开始完美地工作。不知道为什么以前会出现问题!
  • @Sahas:似乎getScript() 的回调函数要么被调用得太早,要么根本没有被调用。如果您将alert() 直接放在回调中,我仍然很想知道会发生什么。如:function(){alert('test');tweetStream();}
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2011-03-15
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多