jQuery .click()在Firebug中工作,但不是Greasemonkey脚本?

时间:2012-11-14 19:26:28

标签: javascript jquery greasemonkey

我正在尝试使用Greasemonkey在Firefox中编写我的第一个用户脚本。我做了很多研究,因为我是用户脚本和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'然后让我知道。它说“脚本已加载”。每次我去Stack Overflow。哈

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

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

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

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

2 个答案:

答案 0 :(得分:3)

你说你已经在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元素并查找冒充元素链的click事件,允许您添加包含这些选择器的新元素,并且将调用侦听器而无需将事件处理程序专门附加到那些元素。

P.S。

在这种特定情况下,您甚至不需要$(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;,这可能会阻止事件进一步向上冒泡

答案 1 :(得分:1)

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

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

您还报告.on()代码无法使用脚本或Firebug。这意味着目标节点(onclick)的ticketEditTableView()函数正在停止事件冒泡。它可能会调用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);
}