【问题标题】:Having trouble converting jQuery to plain Javascript for userscripts无法将 jQuery 转换为用户脚本的纯 Javascript
【发布时间】:2012-09-12 04:43:45
【问题描述】:

好的,这就是交易:我正在尝试创建一个用户脚本,以在 Greasemonkey/Chrome/人们用来管理这些事情的任何其他工具中使用。我想做的一部分是为我为这个特定脚本设计的图标创建标签。我至少对如何在 Jquery 中完成此任务有一个粗略的了解。我会使用的代码是这样的:

$('li.tab.iconic').each(function (i) {
    var spanName = $('this').attr(id);
    var toRemove = '_button';
    var spanNameCrop = spanName.replace(toRemove,'');
    $('this').append('<span class="tooltip_label">'+spanNameCrop+'</span>');
});

基本上,我想获取每个liid 属性,从中修剪短语“_button”,并将剩余的文本插入将成为标签的跨度中。我的问题是我搜索了高低,但没有找到关于如何在 javascript 中执行这样的循环的明确说明。有可能吗?

另外,我正在设计的网站确实包含 Jquery 库。有没有办法告诉我的脚本在站点加载 jquery 后加载,以便 jquery 脚本可以工作?

编辑:感谢 Avladov。这是最终的脚本。

var jQuery, $ = null;

function addJQuery(callback) {
var p = null;

if(window.opera || window.navigator.vendor.match(/Google/)) {
    var div = document.createElement("div");
    div.setAttribute("onclick", "return window;");
    p = div.onclick();
}
else {
    p = unsafeWindow;
}

jQuery = $ = p.jQuery.noConflict();
callback();
}

var myFunction = function() {
jQuery('#header .tab.iconic[id!="missinge_button"] a').css({"background-image":"url('http://i.imgur.com/2QmZG.png')"});

jQuery('#header .tab.iconic').each(function (i) {
    var tabID = jQuery(this).attr('id');
    var labelName = tabID.replace('_button','');
    if (jQuery(this).find('span[class="tooltip_label"]').length){
    }
    else{
    jQuery(this).append('<span class="tooltip_label">'+labelName+'</span>');
    jQuery('.tooltip_label').css({'text-transform':'capitalize'});
    }
});

};

addJQuery(myFunction);

【问题讨论】:

  • 您不应该为this 对象使用引号。将它们用于id 属性$(this).attr('id');
  • 我不记得我是否需要 this 的引号。固定。
  • 您不需要 $(document).ready 在greasemonkey 脚本中。当 GM 脚本开始执行时,文档已经完全加载。

标签: javascript jquery userscripts


【解决方案1】:

你不想使用'this' 你想使用this 并且如果 id 不是具有值的变量字符串,你希望它是一个字符串:

$('li.tab.iconic').each(function (i) {
    var spanName = $(this).attr('id');
    var toRemove = '_button';
    var spanNameCrop = spanName.replace(toRemove,'');
    $('this').append('<span class="tooltip_label">'+spanNameCrop+'</span>');
});

如果网站没有使用 jQuery,你可以为他们添加 jQuery,例如:

if(!(window.jQuery && window.jQuery.fn.jquery == '1.8.1')) {var s = document.createElement('script');s.setAttribute('src', 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js');s.setAttribute('type', 'text/javascript');document.getElementsByTagName('head')[0].appendChild(s);}

【讨论】:

  • 我尝试将其包装在文档就绪函数中,但它杀死了我页面上的纯 JavaScript,现在两者都不起作用。我编辑了我的主要帖子以显示我正在使用的完整脚本。
  • 如果站点没有 jQuery,那么您就不能使用文档就绪功能。我不确定你真正想要什么。
  • Greasemonkey 脚本在 DOMContentLoaded 上执行。这和document ready是一样的,所以不需要它。
  • @voigtan 正如我在问题和原始帖子中所说,我希望将 jquery 转换为纯 javascript。该网站有 jquery,但我不知道我的脚本何时加载与此相关,所以我无法保证它会在 jquery 包含在头部之后插入/运行。
【解决方案2】:

如果您的 Greasemonkey 脚本用于使用 jQuery 的网站,那么您可以在脚本中使用它。使用此代码:

var jQuery, $ = null;

function addJQuery(callback) {
    var p = null;

    if(window.opera || window.navigator.vendor.match(/Google/)) {
        var div = document.createElement("div");
        div.setAttribute("onclick", "return window;");
        p = div.onclick();
    }
    else {
        p = unsafeWindow;
    }

    jQuery = $ = p.jQuery.noConflict();
    callback();
}

CallbackGreasemonkey 脚本 中的一个函数。完成此操作后,您可以将 jQueryjQuery$ 一起使用,就像它是普通网页 JavaScript 一样。

这种方法的好处是它不仅适用于 Firefox,也适用于 Chrome 和 Opera。它也不会加载新的 jQuery 脚本,而是重用网页中的脚本。

示例:

var myFunction = function() {
    // Your code here
};

addJQuery(myFunction);


编辑:
有一种方法可以通过在脚本元数据块中使用 @include@match 来限制脚本。
您可以在 GM Wiki 上阅读更多相关信息 - http://wiki.greasespot.net/Metadata_Block

【讨论】:

  • 试过这个,但没有乐趣。它还干扰了其他站点上的脚本,而不仅仅是我尝试编辑的站点。有没有办法将其限制为仅在我尝试编辑的网站上运行?
  • 我已经在几个脚本中使用了它,并且每次都有效。也许你做错了什么?检查我写的这个脚本。我正在使用相同的方法。它可能有用:userscripts.org/scripts/review/129564
  • 这就是我所拥有的。我使用 @include 将其使用限制在 tumblr 中,并剪掉了所有脚本以添加标签,以便我可以测试脚本的最基本部分(更改背景)是否正常工作。没有骰子。 pastebin.com/nNxisHQr
  • 我想我至少找到了部分问题——除了 Jquery 之外,tumblr 还使用原型。不过,我不确定这会如何影响你给我的 sn-p。
  • 我决定删除我拥有的所有内容并从头开始,我终于让你的代码工作了我已经用工作代码更新了我的原始帖子。感谢您的帮助!
【解决方案3】:

在 document.ready 函数中添加您的 jquery 脚本

$(document).ready(function(){
$('li.tab.iconic').each(function (i) {
    var spanName = $('this').attr('id');
    var toRemove = '_button';
    var spanNameCrop = name.replace(toRemove,'');
    $(this).append('<span class="tooltip_label">'+spanNameCrop+'</span>');
});
})

当页面上的所有资源都被抓取后,代码将执行

您可以在此处阅读更多内容: http://api.jquery.com/ready/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2011-10-09
    • 2018-05-26
    • 2018-05-11
    • 2012-03-08
    • 2020-07-24
    • 2013-10-22
    相关资源
    最近更新 更多