0

更新- 我在 html 表单中添加了以下链接。单击后, form.submit() 会正常工作。

<a href="#" onClick="post_to_url('abc');">click</a>

form.submit() 仅在捕获按键时不起作用。

更新 2 - 我将 event.keyCode == 27 更改为 event.keyCode == 65,瞧,按下“A”键,submit() 将起作用。所以问题在于对转义键的一些干扰。有任何想法吗?

更新 3 - 已解决- 解决方案是在下面的代码中将 keydown 更改为 keyup

结束更新

我的目标是捕获用户转义按键并转到新网址。我已经成功捕获了转义键并调用了动态创建表单以使用传递的 url 提交的函数。我已经使用 alert() 验证了 url 已正确传递,但表单不会提交。我无法弄清楚什么不起作用。提前致谢。

捕获转义键的密钥处理程序在这里(注意:解决方案是在下面的代码中将 keydown 更改为 keyup - 为了帖子的完整性,我将其单独放置):

<script type="text/javascript">
window.addEventListener("keydown", function(event) {
    // Bind to both command (for Mac) and control (for Win/Linux)
    if (event.keyCode == 27) {          
    if (document.getElementById('url')){
        path = document.getElementById('url').value;
        post_to_url(path);
    }
    }
}, false);
</script>

创建要发布的表单的功能在这里:

<script type="text/javascript">
function post_to_url(path, params, method) {
method = method || "post"; // Set method to post by default if not specified.
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
for(var key in params) {
    if(params.hasOwnProperty(key)) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);

        form.appendChild(hiddenField);
     }
}

document.body.appendChild(form);
form.submit();
}
</script>

我包含了 HTML 代码以使此示例完整:

<body>
    <form id = 'close' action='' method="POST">
        <input id="url" type="text" value="urlHere">
        <input type="submit" name="OK">
        <!--when clicking on this - form.submit() works as it should -->
        <a href="#" onClick="post_to_url('abc');">click</a>
    </form>
</body>
4

2 回答 2

0

首先确保在params调用时传递了参数post_to_url。这似乎不会发生在您的 keydown 事件处理程序
中第二次检查document.getElementById('url').value指向您希望将数据提交到的脚本的值。
第三,确保params参数是一个带有成员/键的 js 对象。

注意:您无需将表单添加到文档中即可提交。

编辑通过上述清单后,您应该拥有以下有效的代码.....

var prm = {"ABC":"123"}//object to be submitted

function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default if not specified.
    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    for(var key in params) 
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);
            form.appendChild(hiddenField);
         }
    form.submit();
}

window.addEventListener("keydown", function(event) {
    // Bind to both command (for Mac) and control (for Win/Linux)
    if (event.keyCode == 27) {          
        post_to_url("index.php",prm);//swap index.php with your url, for prm, see above
    }
}, false);
于 2013-08-16T01:57:22.117 回答
0

最后,我将“keydown”更改为“keyup”。如此简单 - 花了我几个小时。最终的监听器代码如下。出于我的需要,我没有将任何参数传递给 post_to_url() 除了 url 路径。您可能想要传递参数。您可以在上面看到 Moje 的示例。

<script type="text/javascript">
window.addEventListener("keydown", function(event) {
    // Bind to both command (for Mac) and control (for Win/Linux)
    if (event.keyCode == 27) {          
    if (document.getElementById('url')){
        path = document.getElementById('url').value;
        post_to_url(path);
    }
    }
}, false);
</script>
于 2013-08-16T06:34:04.500 回答