【问题标题】:jQuery .click() works in Firebug, but not a Greasemonkey script?jQuery .click() 在 Firebug 中有效,但不是 Greasemonkey 脚本?
【发布时间】:2012-11-14 19:26:28
【问题描述】:

我正在尝试在 Firefox 中使用 Greasemonkey 编写我的第一个用户脚本。我做了很多研究,因为我是用户脚本和 jQuery 的新手,但我似乎无法让这个简单的测试脚本工作。到目前为止,我在Test.user.js 文件中有这个:

// ==UserScript 
// @name            Desk Notifications 
// @description     Displays special notifications to NVOWS coaches at desk.com
// @downloadURL     http://www.example.com/deskNotifications.user.js
// @include         http://nvows.desk.com/agent
// @namespace       http://www.example.com/userscripts
// @updateURL       http://www.example.com/deskNotifications.meta.js
// @version         0.1
// @grant           none
// ==/UserScript 

$(document).ready(function(){ 
    alert('Script loaded.'); 
    $('.interaction_type_60').click(function() { 
        alert("You clicked a case!"); 
    }); 
    $('.interaction_type_40').click(function() { 
        alert("You clicked a case!"); 
    }); 
});


我需要它做的显然要复杂得多,但因为我是 jQuery 和用户脚本的新手,所以我只想先完成这项工作。至此“脚本已加载”。正在显示,以便排除许多可能的问题。当我在 firebug 中只运行这部分代码时,它工作正常:

$(document).ready(function(){ 
    alert('Script loaded.'); 
    $('.interaction_type_60').click(function() { 
        alert("You clicked a case!"); 
    }); 
    $('.interaction_type_40').click(function() { 
        alert("You clicked a case!"); 
    }); 
});

这样就排除了代码错误或抓取错误的类选择器。如果代码正确并且正在执行,我看不出可能是什么问题。如果有人可以提供帮助,将不胜感激。我不是编程新手。只是基于网络的东西。

这是我试图在点击它时看到的 HTML 页面的一部分。

<tbody id="ticket_filter_list_items" class=" ">
<tr id="ticket_filter_item_73354627" class="ticket_filter_item ticket_filter_item_table_view interaction_type_60 ticket_filter_item_open ticket_filter_item_current_selected" onclick=" ticketEditTableView(73354627, event);return false; " data-in-search="" data-ticket-id="73354627" style="">
<tr id="ticket_filter_item_73382205" class="ticket_filter_item ticket_filter_item_table_view interaction_type_40 ticket_filter_item_open " onclick=" ticketEditTableView(73382205, event);return false; " data-in-search="" data-ticket-id="73382205" style="">
</tbody>



这是题外话,没什么大不了的,但如果你看到一些东西会使这个用户脚本在不是“http://nvows.desk.com/agent”的页面上执行'然后告诉我。它说“脚本已加载”。每次我去堆栈溢出。哈。

---------------------------------- ---

更新:
我只是尝试这样做以进行测试:

$(document)
.on('click', this, function(){
    alert('Please Work!!!!');
})

我一直试图点击的东西是没有显示消息的东西。页面加载后,所有这些都加载了javascript。我几乎是肯定的,这就是他们不允许我点击它们的原因。有没有办法点击这些项目。在 HTML 脚本中,它们看起来与其他元素相同。

【问题讨论】:

  • 您可以在问题中添加标记吗?
  • @iMoses 我不确定你的意思是什么?再一次,我是网络新手。我不确定你在说什么标记。
  • 他要求查看您的代码的 HTML 部分
  • @mplungjan 我可以试试。但是为什么我让它在 firebug 中运行而不是在实际脚本中运行呢?
  • @DawsonLoudon 哦。我应该考虑到这一点。我没有任何 HTML。我正在制作一个使用网站 desk.com 的用户脚本。我猜你看不到,虽然没有帐户。这是一大堆代码,所以我将编辑原始帖子以包含我想要影响的部分。

标签: javascript jquery greasemonkey


【解决方案1】:

您说您已经在 firebug 控制台上运行了代码,并且运行良好,因此这里的选项很少。 我相信您尝试添加这些事件的 HTML 标签尚未创建。如果这些元素是通过 JavaScript 创建的并且创建它们的代码尚未运行,则会发生这种情况。另一种可能性是元素在 DOM 上但尚未收到这些类,如果这些类是使用 JavaScript 给出的,也可能发生。

试试这个代码示例,看看它是否有帮助(让我知道结果):

$(document).ready(function(){ 
    alert('Script loaded.'); 
    $(document)
        .on('click', '.interaction_type_60', function() { 
            alert("You clicked a case!"); 
        })
        .on('click', '.interaction_type_40', function() { 
            alert("You clicked a case!"); 
        }); 
});

注意:当您的原始代码运行时,您尝试将这些事件附加到的元素必须出现在 DOM 上,并且它们必须具有您定义的类。我的代码所做的是将事件附加到文档元素并查找冒泡元素链的单击事件,允许您添加包含这些选择器的新元素,并且将调用侦听器,而无需专门将事件处理程序附加到那些元素。

附言

在这种特定情况下,您甚至不需要 $(document).ready(..) 部分。您可以使用:

$(document)
    .on('click', '.interaction_type_60', function() { 
        alert("You clicked a case!"); 
    })
    .on('click', '.interaction_type_40', function() { 
        alert("You clicked a case!"); 
    });

因为事件附加到始终存在的文档元素。

编辑:看到你的标记后,我相信问题也可能是内联 onclick 事件使用 return false;,这可能会阻止事件在链上进一步冒泡。

【讨论】:

  • 首先让我说“谢谢!”对于伟大的反应。我想我明白你在说什么。你是绝对正确的。加载页面时,html 中不存在这些类。当我刷新页面时,我看到它们填充了 Firebug。所以我明白为什么我的不工作了。但是一旦他们在页面上,我就可以运行脚本,这就是为什么在 Firebug 中运行它的原因。但是您所说的是通过使用 .on() 函数,它会监听点击以查看它是否在“.interactoin_type_60”上。这对我来说很重要,但是当我在 firebug 或实际脚本中运行它时,它没有给出任何结果。
  • 我现在要阅读有关 .on() 函数的内容,看看我能弄清楚什么。你对我帮助很大。此外,我编辑了原始帖子以显示我正在运行脚本的站点的一些 HTML。
  • 首先欢迎您。我已经看过 HTML,如果您阅读我上次的编辑,您会看到我回复了它。不幸的是,我错了,显然return false 不应该干扰,正如您在此示例中看到的那样:jsfiddle.net/m8mAZ
  • 但是ticketEditTableView()函数可能会阻塞.on()
  • 我想过,这似乎不太可能但可能。它可能会阻止进一步冒泡。
【解决方案2】:

您说,当您从 Firebug 运行原始的 .click() 代码时,它可以工作。

正如 iMoses 所指出的,它不适用于 Greasemonkey 脚本,因为该脚本在页面的 javascript 创建目标节点之前触发。

您还报告说,.on() 代码在脚本或 Firebug 中都不起作用。这意味着您的目标节点 (ticketEditTableView()) 的 onclick 函数正在停止事件冒泡。它可能会调用event.stopPropagation()

解决方案是返回.click(),但在将目标节点添加到页面时应用它。这可以通过the waitForKeyElements() utility 完成。

这是一个完整的脚本,它使用waitForKeyElements.click() 绑定到这些节点,因为它们被添加到页面中:

// ==UserScript
// @name        Desk Notifications
// @description Displays special notifications to NVOWS coaches at desk.com
// @downloadURL http://www.example.com/deskNotifications.user.js
// @include     http://nvows.desk.com/agent
// @namespace   http://www.example.com/userscripts
// @updateURL   http://www.example.com/deskNotifications.meta.js
// @version     0.1
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant GM_addStyle directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

waitForKeyElements (
    ".interaction_type_60, .interaction_type_40", addAlertOnClick
);

function addAlertOnClick (jNode) {
    jNode.click (alertOnClick);
}

function alertOnClick (zEvent) {
    var targNode    = $(zEvent.currentTarget);
    var messageStr  = "Oopsie!";

    if (targNode.hasClass ("interaction_type_60") ) {
        messageStr  = "You clicked a type 60 case!"
    }
    else if (targNode.hasClass ("interaction_type_40") ) {
        messageStr  = "You clicked a type 40 case!"
    }

    alert (messageStr);
}

【讨论】:

  • 好的。我尝试了代码,但看不到会导致 messageStr 显示的原因。我查找了 waitForKeyElements 但我只能在 github 上找到它,所以我按照代码查看它的作用。我想看看这个函数是否正常工作,所以我制作了一个测试脚本,看看我是否可以在加载具有类 .ui-tabs-selected 的元素时显示消息。该元素是在页面初始加载后创建的。这是我的脚本: waitForKeyElements ( ".ui-tabs-selected", addAlert ); function addAlert (jNode) { alert('ui-tabs-selected 已加载'); } 这永远不会显示。
  • 更正。 上面的代码有效。我不知道为什么一开始它不起作用,但现在它起作用了。我用它来解决这个问题。我确实有一个简单得多的新问题。 View Problem 如果我得到它的工作,我会发布我自己的答案。
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2012-07-16
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多