在bookmarklet中返回undefined - 转发页面

时间:2011-06-21 00:02:42

标签: javascript ruby-on-rails bookmarklet

我正在尝试使用Rails创建一个简单的书签,创建一个包含当前页面标题和URL的表单,然后提交以创建一个对象。

我遇到的问题是,当表单提交时,它会转发到“成功”页面,而不是只停留在应该的页面上。

我知道bookmarklet代码应返回undefined以阻止这种情况发生,但我已经尝试将void(0)放在我能想到的任何地方,但它仍然会转发到下一页。

以下是我尝试过的两种方式:

javascript:void((function(){
var s = document.createElement('script');
s.setAttribute('language','javascript');
s.setAttribute('src','http://localhost:3000/script/bookmarklet.js');
document.body.appendChild(s);
})());

javascript:(function(){
var s = document.createElement('script');
s.setAttribute('language','javascript');
s.setAttribute('src','http://localhost:3000/script/bookmarklet.js');
document.body.appendChild(s);
void(0);
})();

其他.js文件是否会导致问题?这是:

(function() {

function create_form() {
    var path = "http://localhost:3000/links";

    var newform = document.createElement('form');
    newform.setAttribute("method", "post");
    newform.setAttribute("action", path);
    newform.setAttribute("accept-charset","UTF-8");

    var title_hidden_field = document.createElement("input");
    title_hidden_field.setAttribute("type","hidden");
    title_hidden_field.setAttribute("name", "link[title]");
    title_hidden_field.setAttribute("value", "Test Title");

    newform.appendChild(title_hidden_field);

    var url_hidden_field = document.createElement("input");
    url_hidden_field.setAttribute("type","hidden");
    url_hidden_field.setAttribute("name", "link[url]");
    url_hidden_field.setAttribute("value", "http://www.example.com");

    newform.appendChild(url_hidden_field);

    document.body.appendChild(newform);
    newform.submit();
};

create_form();
})();

我也尝试在那里返回undefined,但转发行为没有改变。它可能与rails处理表单发布请求的方式有关吗?

2 个答案:

答案 0 :(得分:1)

首先,void(0)用于获取未定义的返回值,这是一种停止转到下一页的方法,但不适用于此处。另外,请确保在书签的末尾保留void(0)。

我可以想到停止进入下一页的一种方法是首先创建一个不可见的内联框架(iframe)

var myiframe = document.createElement('iframe');
myiframe.scrolling = "no";
myiframe.name = "myiframe";
myiframe.id = "myiframe";
myiframe.src = "blank.html"; //so your users wont have to use their bandwith much, I think you can also set it to the about page in many browsers
myiframe.width = "0px"; //so it becomes invisible
myiframe.height = "0px"; //""
document.body.appendChild(myiframe)

var ThisBody = document.body.innerHTML
ThisBody += '<iframe frameborder="0" scrolling="no" name="myiframe" id="myiframe" src="blank.html" width="0px" height="0px"></iframe>

然后通过使用目标设置newform,这是最重要的部分:

newform.target = "document.getElementById('myiframe')" //our iframe

我认为就是这样。

另外:

javascript:(function(){
var s = document.createElement('script');
s.setAttribute('language','javascript');
s.setAttribute('src','http://localhost:3000/script/bookmarklet.js');
document.body.appendChild(s);
})();void(0)

这是无效的地方^^

答案 1 :(得分:1)

在“newform”中添加“onsubmit”处理程序,并使用XMLHttpRequest发送数据。

    newform.onsubmit = function(event) {
        event.preventDefault();
        // Create XMLHttpRequest object and send data.
    }