Javascript - 表单选择元素在新窗口中打开 url 并提交表单

Posted

技术标签:

【中文标题】Javascript - 表单选择元素在新窗口中打开 url 并提交表单【英文标题】:Javascript - form select element open url in new window and submit form 【发布时间】:2010-10-08 13:50:06 【问题描述】:

已更新 - 请阅读原始问题下方的更多详细信息

我有一个带有各种 url 的选择表单元素,我想在选择时在新窗口中打开 - 为此,我在元素的 onchange 事件中有以下代码:

window.open(this.options[this.selectedIndex].value,'_blank');

这很好用。但我也想在更改此选择元素值时提交表单 - 我尝试了各种方法,但似乎无法让它工作。

我有 jquery,所以如果通过它更容易实现,那很好。

更新 - 我刚刚意识到上面还有另一个问题,因为一些 url 实际上用于生成和输出 pdf,而这些不起作用 - 它们打开然后立即关闭(至少在 IE7 中)。

2009 年 7 月 5 日更新 - 我现在已经为这个问题开了一个赏金,因为我真的需要想出一个可行的解决方案。我最初确实通过显示链接而不是表单选择元素来解决这个问题,但这不再可行。

我需要上述内容的原因是我有大量可能需要查看/打印的文件,太多而无法合理地显示为链接列表。我需要提交表单以记录特定文件已被查看/打印的事实,然后在表单上显示文件历史记录 - 我很乐意实现这一方面,所以不需要帮助,但我认为这将有助于放置上下文。

所以,为了阐明我的要求 - 我需要一个表单选择元素和“查看”按钮,单击该按钮不仅会在新窗口中启动文件下载(请注意当这些文件是 PDF 时我遇到的上述问题),而且同时提交包含选择元素的表单。

【问题讨论】:

IE关闭可能是因为文件已下载,浏览器无法打开,比如没有安装Adobe Reader。 不幸的是,IE 问题仍然存在 - 它打开文件然后立即关闭窗口,即使我已安装并运行 Acrobat Reader 并且禁用了弹出窗口阻止程序。这个问题在这里有详细说明***.com/questions/400010/… 【参考方案1】:

来吧

<script type="text/javascript">
    $(function() 
        $("#selectElement").change(function() 
            if ($(this).val()) 
                window.open($(this).val(), '_blank');
                $("#formElement").submit();
            
        );

        // just to be sure that it is submitting, remove this code
        $("#formElement").submit(function() 
            alert('submitting ... ');
        );
    );
</script>

<form id="formElement" method="get" action="#">
    <select id="selectElement">
        <option></option>
        <option value="http://www.deviantnation.com/">View Site 1</option>
        <option value="http://***.com/">View Site 2</option>
        <option value="http://serverfault.com/">View Site 3</option>
    </select>
</form>

【讨论】:

+1 - 没有理由不能在每个浏览器中完美运行。如果这不起作用,那么 BrynJ 的其他代码有问题。 ...确实如此 :) 我已经设法解决了我在 IE 关闭弹出窗口时遇到的问题。【参考方案2】:

可以使用this.form.submit()触发表单提交:

<script language="javascript">
    function myChangeHandler() 
        window.open(this.options[this.selectedIndex].value, '_blank');
        this.form.submit();

</script>

<select onchange="myChangeHandler.apply(this)">
    ...
</select>

【讨论】:

嗨,阿伦。我已经尝试过这种语法,但出现“对象不支持此属性或方法”错误。我认为上述方法也可以,但似乎有什么东西把它扔掉了? 很奇怪 - 我仍然得到同样的错误?这可能是什么原因造成的? @BrynJ:有两个常见错误可能会导致这种情况。表单中有一个名称或 id 为“submit”的元素,您必须更改它才能使用表单的“submit”方法;或者您拥有的对象不是表单,并且可能是具有该 id 或名称的表单或其他元素的数组。 确实有一个名为“提交”的元素 - 感谢您的建议,将再试一次!【参考方案3】:

刚刚测试了 Aron 的示例,它工作正常,所以我建议您得到的错误来自 onchange 事件之外的代码。试试下面的例子,看看你是否得到同样的错误。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> Example onchange and submit </TITLE>

  <script language="javascript">    
   function myChangeHandler() 
   
    window.open(this.options[this.selectedIndex].value, '_blank');
    this.form.submit();
   
  </script>
 </HEAD>

 <BODY>
 <form id="myform1" action="test.html">
  <select onchange="myChangeHandler.apply(this)">
    <option>Please select....</option>
    <option value="http://***.com">***</option>
    <option value="http://twitter.com">Twitter</option>
    </select>
  </form>
 </BODY>
</HTML>

【讨论】:

【参考方案4】:

根据您的描述,您的标记可能如下所示:

<form ...>
  <input name="submit" ...>
  ...
</form>

由于浏览器的传统是向表单元素的对象(作为属性)输入的名称添加名称,输入中的“提交”属性掩盖了表单固有的“提交”属性或方法。您可以通过重命名输入元素(即使是临时重命名)来纠正此问题(假设只有一个):

form_object.elements['submit'].name = 'notsubmit';
form_object.submit();

如果有多个——例如,由于某种原因,一系列名为“提交”的单选按钮——那么 .elements['submit'] 应该是一个元素集合,它就像一个数组,你可以循环做同样的事情。

【讨论】:

感谢您的有用解释!【参考方案5】:

您知道可以为表单设置目标属性吗?

<form target="_blank" method="post">
  <select onchange="load()">
    ...
  </select>
</form>
<script>
  load() 
    document.forms[0].action = this.value;
    document.forms[0].submit();
  
</script>

原谅可能不好的 Javascript。这些天我倾向于做更多的jQuery,所以我对香草Javascript生疏了。但是你大概明白了。

【讨论】:

对不起,我应该更清楚一点——表单的目标不是新的 url,我只是想在这个特定的选择元素更改后提交表单。【参考方案6】:

虽然我不熟悉 jQuery,但你应该可以做这样的事情(原型风格):

$('select-field').observe('change',function(event)
  window.open(this.options[this.selectedIndex].value,'_blank');
  this.form.submit();

虽然我之前在使用 Javascript 提交表单时遇到过一些奇怪的问题,所以如果这不起作用,您可以尝试在表单的提交按钮上调用 click() 或等效的 fireEvent('click'),如下所示:

$('submit-button').fireEvent('click');

【讨论】:

试过了,但我得到了同样的“对象不支持这个属性或方法”错误。

以上是关于Javascript - 表单选择元素在新窗口中打开 url 并提交表单的主要内容,如果未能解决你的问题,请参考以下文章

iPad Chrome - 在新窗口/选项卡中提交表单不起作用

当用户选择“在新选项卡中打开”/“在新窗口中打开”而不是使用 html/javascript 点击时如何到达所需的页面

JavaScript 在新窗口中打开,而不是选项卡

在新的 Facebook JavaScript SDK 中显示弹出窗口

在新窗口中打开 Access 中的子表单

在新选项卡/窗口中打开页面并将当前窗口定向到新 url