单击书签时意外打开新页面
因此,我制作了一个书签来折叠表格中的每一行(第一行除外),然后使第一行切换/显示表格的其余部分:
javascript:(function(){
function open(tableid){
console.log('open');
for (j=1;j<table[tableid].rows.length;j++){
if(table[tableid].rows[j].style.display == 'none' ){
table[tableid].rows[j].style.display = '';
} else if(table[tableid].rows[j].style.display == ''){
table[tableid].rows[j].style.display = 'none';
}
}
}
var table = document.getElementsByTagName("table");
for (i=0;i<table.length;i++){
for (j=0;j<table[i].rows.length;j++){
if( j != 0){
table[i].rows[j].style.display = 'none';
}
if( j == 0){
table[i].rows[j].onclick = new Function("open("+i+")");
}
}
}
})();
我在 firebug 的控制台中运行此代码时没有 javascript:(function(){}() ,但是当我将它用作书签时,每次我单击第一行显示表格时,它都会打开一个新页面“0”(即 website.com/0) )
So I made a bookmarklet to collapse every row in a table, except the first one, then make that first row toggle/show the rest of the table:
javascript:(function(){
function open(tableid){
console.log('open');
for (j=1;j<table[tableid].rows.length;j++){
if(table[tableid].rows[j].style.display == 'none' ){
table[tableid].rows[j].style.display = '';
} else if(table[tableid].rows[j].style.display == ''){
table[tableid].rows[j].style.display = 'none';
}
}
}
var table = document.getElementsByTagName("table");
for (i=0;i<table.length;i++){
for (j=0;j<table[i].rows.length;j++){
if( j != 0){
table[i].rows[j].style.display = 'none';
}
if( j == 0){
table[i].rows[j].onclick = new Function("open("+i+")");
}
}
}
})();
I run this without javascript:(function(){}() in firebug's console, and it works fine. But when I use it as a bookmarklet, every time I click on the first row to show the table, it just opens a new page '0' (i.e. website.com/0 )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Function 构造函数创建一个全局函数,而不是函数内的词法函数。因此,它无法访问名为 open 的本地函数,因此它使用窗口的 open 方法。
根据我的测试,您的代码应该始终引用全局 open 方法,无论是从书签还是页面本身运行。
看这个例子:
这是您问题的可能解决方案
the Function constructor creates a global function, not lexically within your function. Therefore, it doesn't have access to your local function called open, so it uses the window's open method.
From my tests, your code should always be referencing the global open method whether run from a bookmarklet or the page itself.
Look at this example:
Here's a possible solution to your problem