如何修复 waitForKeyElements 被黑版本中的无限循环?
How do I fix an infinite loop in a hacked version of waitForKeyElements?
我公司的网站使用the Metronic Horizontal Menu admin panel, but it's an older version that uses a Gear instead of the user profile picture and name。在 Firefox 30 之前,这个 Greasemonkey 脚本可以正常工作,并将 "My Profile" 和 "Log Out" 按钮移动到用户 profile/name 下,同时保留 "My Calendar"、"My Inbox" 和 "My Tasks" 在齿轮图标下拉菜单中。这是我的 Greasemonkey 代码:
// ==UserScript==
// @name Fix User Dropdown
// @description Fixes the user dropdown to match current version.
// @include mywebsite.com
// @version 2.0.0
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
waitForKeyElements (".topMenu1", addUserDropdown, true);
function addUserDropdown(jNode) {
$('#greetingName').remove();
var userSession = unsafeWindow.userSession;
var userId = userSession.id;
var firstName = userSession.firstName;
var lastName = userSession.lastName;
var fullName = firstName + ' ' + lastName;
var accountId = userSession.accountId;
$('.top-menu .nav').prepend(
'<li class="dropdown dropdown-user dropdown-dark">' +
'<a data-close-others="true" data-hover="dropdown" data-toggle="dropdown" class="dropdown-toggle username username-hide-mobile floatRight" href="#" style="padding:10px;border-right:1px solid #000;margin:5px;">' +
fullName +
'</a>' +
'<ul id="userPersonalMenu" class="dropdown-menu dropdown-menu-default">' +
'<li>' +
'<a href="/user/editor?id=' + userId + '&accountId=' + accountId + '" id="greetingNameLink">' +
'<i class="icon-settings"></i> My Profile </a>' +
'</li>' +
'<li>' +
'<a href="/logout">' +
'<i class="icon-key"></i> Log Out </a>' +
'</li>' +
'</ul>' +
'</li>');
$('.dropdown-toggle').dropdownHover({});
return null;
}
事情是这样的:
它永远不会打印 "CANCEL FOUND",就我而言,这违反了逻辑,因为调用堆栈仍应解析。然后它继续在屏幕上从右到左然后从上到下无限绘制用户名(示例中的 "Nick")。
我希望将 bWaitOnce 设置为 true 可以解决这个问题,但没有成功。
我补充了:
// @require https://raw.githubusercontent.com/CWSpear/bootstrap-hover-dropdown/master/bootstrap-hover-dropdown.js
在我的用户脚本顶部获取悬停下拉菜单的最新版本,它成功了!
故事的寓意,检查您的用户脚本使用了哪些页面依赖项,并确保它们与 *Monkey 兼容。
我公司的网站使用the Metronic Horizontal Menu admin panel, but it's an older version that uses a Gear instead of the user profile picture and name。在 Firefox 30 之前,这个 Greasemonkey 脚本可以正常工作,并将 "My Profile" 和 "Log Out" 按钮移动到用户 profile/name 下,同时保留 "My Calendar"、"My Inbox" 和 "My Tasks" 在齿轮图标下拉菜单中。这是我的 Greasemonkey 代码:
// ==UserScript==
// @name Fix User Dropdown
// @description Fixes the user dropdown to match current version.
// @include mywebsite.com
// @version 2.0.0
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
waitForKeyElements (".topMenu1", addUserDropdown, true);
function addUserDropdown(jNode) {
$('#greetingName').remove();
var userSession = unsafeWindow.userSession;
var userId = userSession.id;
var firstName = userSession.firstName;
var lastName = userSession.lastName;
var fullName = firstName + ' ' + lastName;
var accountId = userSession.accountId;
$('.top-menu .nav').prepend(
'<li class="dropdown dropdown-user dropdown-dark">' +
'<a data-close-others="true" data-hover="dropdown" data-toggle="dropdown" class="dropdown-toggle username username-hide-mobile floatRight" href="#" style="padding:10px;border-right:1px solid #000;margin:5px;">' +
fullName +
'</a>' +
'<ul id="userPersonalMenu" class="dropdown-menu dropdown-menu-default">' +
'<li>' +
'<a href="/user/editor?id=' + userId + '&accountId=' + accountId + '" id="greetingNameLink">' +
'<i class="icon-settings"></i> My Profile </a>' +
'</li>' +
'<li>' +
'<a href="/logout">' +
'<i class="icon-key"></i> Log Out </a>' +
'</li>' +
'</ul>' +
'</li>');
$('.dropdown-toggle').dropdownHover({});
return null;
}
事情是这样的:
它永远不会打印 "CANCEL FOUND",就我而言,这违反了逻辑,因为调用堆栈仍应解析。然后它继续在屏幕上从右到左然后从上到下无限绘制用户名(示例中的 "Nick")。
我希望将 bWaitOnce 设置为 true 可以解决这个问题,但没有成功。
我补充了:
// @require https://raw.githubusercontent.com/CWSpear/bootstrap-hover-dropdown/master/bootstrap-hover-dropdown.js
在我的用户脚本顶部获取悬停下拉菜单的最新版本,它成功了!
故事的寓意,检查您的用户脚本使用了哪些页面依赖项,并确保它们与 *Monkey 兼容。