Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 加载Bookmarklet时发生未捕获引用错误_Javascript - Fatal编程技术网

Javascript 加载Bookmarklet时发生未捕获引用错误

Javascript 加载Bookmarklet时发生未捕获引用错误,javascript,Javascript,我正在尝试构建一个简单的Bookmarklet,将一些外部Javascript加载到页面中,目标是向另一个站点添加一个像Stackoverflow这样的标记编辑器。我有它的工作,但它需要我点击我的书签按钮2次,而不是1次 第一次单击会出现此错误 Uncaught ReferenceError: Markdown is not defined init.js:46 第46行是 var converter1 = Markdown.getSanitizingConverter(); 现在,在第二次

我正在尝试构建一个简单的Bookmarklet,将一些外部Javascript加载到页面中,目标是向另一个站点添加一个像Stackoverflow这样的标记编辑器。我有它的工作,但它需要我点击我的书签按钮2次,而不是1次

第一次单击会出现此错误

Uncaught ReferenceError: Markdown is not defined init.js:46
第46行是

var converter1 = Markdown.getSanitizingConverter();
现在,在第二次单击我的Bookmarklet之后,一切都运行得很好,但是第一次单击总是会出现错误,什么也不做

这是Bookmarklet文件的代码,请帮助我修复,我的Javascript技能不太好

加载外部JS和CSS文件

function loadScripts(scriptURL) {
    var scriptElem = document.createElement('SCRIPT');
    scriptElem.setAttribute('language', 'JavaScript');
    scriptElem.setAttribute('src', scriptURL);
    void(document.body.appendChild(scriptElem));
}

// Load these 3 Javascript files into the page
// jQuery is already loaded into the page being used so no need to load it
loadScripts('http://codedevelopr.com/labs/javascript/forrst/Markdown.Converter.js');
loadScripts('http://codedevelopr.com/labs/javascript/forrst/Markdown.Sanitizer.js');
loadScripts('http://codedevelopr.com/labs/javascript/forrst/Markdown.Editor.js');

// Load the CSS file into the Page
var head = document.getElementsByTagName('head')[0];
$(document.createElement('link')).attr({
    type: 'text/css',
    href: 'http://codedevelopr.com/labs/javascript/forrst/demo.css',
    rel: 'stylesheet'
}).appendTo(head);
加载文件后,我们将运行此

// Find and replace the curent textarea with the HTML we
// need for our markdown editor to work 
$(document).ready(function () {
    var htmlToReplace = ' \
  <div class="wmd-panel"> \
    <div id="wmd-button-bar"></div> \
      <textarea class="wmd-input" id="wmd-input" name="description"></textarea> \
  </div> \
  <div id="wmd-preview" class="wmd-panel wmd-preview"></div>';

    $("#description").replaceWith(htmlToReplace);

    //Run the Markdown editor!
    var converter1 = Markdown.getSanitizingConverter();

    var editor1 = new Markdown.Editor(converter1);
    editor1.run();

});

使用标记时尚未加载脚本文件。你只是发送了请求。您必须等待,直到收到并解析响应

在您使用jQuery时,我已经对您的代码进行了一些清理:

var urls = [
  'http://codedevelopr.com/labs/javascript/forrst/Markdown.Converter.js',
  'http://codedevelopr.com/labs/javascript/forrst/Markdown.Sanitizer.js',
  'http://codedevelopr.com/labs/javascript/forrst/Markdown.Editor.js'
];

// map urls to getScript calls, and pass them to $.when
$.when.apply($, $.map(urls, $.getScript)).then(function() {
  // use markdown here
});

$("<link>", {
  href: 'http://codedevelopr.com/labs/javascript/forrst/demo.css',
  rel: 'stylesheet'
}).appendTo("head");

使用标记时尚未加载脚本文件。你只是发送了请求。您必须等待,直到收到并解析响应

在您使用jQuery时,我已经对您的代码进行了一些清理:

var urls = [
  'http://codedevelopr.com/labs/javascript/forrst/Markdown.Converter.js',
  'http://codedevelopr.com/labs/javascript/forrst/Markdown.Sanitizer.js',
  'http://codedevelopr.com/labs/javascript/forrst/Markdown.Editor.js'
];

// map urls to getScript calls, and pass them to $.when
$.when.apply($, $.map(urls, $.getScript)).then(function() {
  // use markdown here
});

$("<link>", {
  href: 'http://codedevelopr.com/labs/javascript/forrst/demo.css',
  rel: 'stylesheet'
}).appendTo("head");


3个外部脚本在运行时追加,但异步加载,您需要同步加载它们,或者在加载脚本后设置回调以启动标记。您可以尝试调整loadScripts函数以适应它。@fabriciomatté是对的。用外行的话来说,浏览器不会等待每个脚本加载后再继续编写代码。所有3个脚本同时加载,其余脚本在其他3个脚本完成加载之前运行。@Kranklin是的,这是更好的解释。=]有了jQuery,您可以使用$.getScript并设置回调,使其仍然异步加载并使其工作,但没有jQuery,我想您必须同步加载它们,这可能会挂起浏览器。哦,您已经在使用jQuery了。这应该很容易解决。最后一个问题是,上面的所有代码都在一个bookmarklet中,对吗?@jasondavis:听起来你想要$.when和.then。这将允许您适当延迟标记代码。3个外部脚本在运行时追加,但异步加载,您需要同步加载它们,或者在加载脚本后设置回调以启动标记。您可以尝试调整loadScripts函数以适应它。@fabriciomatté是对的。用外行的话来说,浏览器不会等待每个脚本加载后再继续编写代码。所有3个脚本同时加载,其余脚本在其他3个脚本完成加载之前运行。@Kranklin是的,这是更好的解释。=]有了jQuery,您可以使用$.getScript并设置回调,使其仍然异步加载并使其工作,但没有jQuery,我想您必须同步加载它们,这可能会挂起浏览器。哦,您已经在使用jQuery了。这应该很容易解决。最后一个问题是,上面的所有代码都在一个bookmarklet中,对吗?@jasondavis:听起来你想要$.when和.then。这将允许您适当地推迟降价代码。@Fabricio Matté:这是一个值得记住的有趣函数。它有时会非常方便。是的,我几乎从来没有使用过JS函数,喜欢这个问题以备将来参考。这是非常干净的,感谢你和@Fabriciomatté的帮助=1问题也许你可以帮助。未捕获的TypeError:无法调用的方法“apply”undefined@jasondavis:也许是较旧的jQuery版本?@Fabricio Matté:这是一个值得记住的有趣函数。它有时会非常方便。是的,我几乎从来没有使用过JS函数,喜欢这个问题以备将来参考。这是非常干净的,感谢你和@Fabriciomatté的帮助=1问题也许你可以帮助。未捕获的TypeError:无法调用的方法“apply”undefined@jasondavis:可能是较旧的jQuery版本?