在 IE8 中通过一个按钮(在多个按钮中)以新的 window 提交表单

Submit form in new window from one button (out of many) in IE8

我有一个带有 "preview" 提交输入的表单,它提交与其他表单相同的表单,但带有一个 "visualize" 参数,该参数必须打开一个新的 window(为了使表格保持在临时状态)。如果我正在为闪亮干净的 HTML5 浏览器设计,我可以使用新的 formTarget 属性很好地做到这一点:

<form id="myForm" action="somecontroller/action">
  <input type="text" name="someValue" />
  <input type="submit" id="visualize" value="Visualize" name="visualize" formTarget="_blank" />
  <input type="submit" value="Submit" name="submit" />
</form>

遗憾的是,该产品的主要用户群仍在使用 IE8(它是一个内部网络),因此该网站只能处理 IE8。我还没有找到一种方法让这个简单的东西在 javascript 中工作。

我找到了 this very nice answer 并尝试应用它,它在我的情况下不起作用,因为我猜它不会提交带有 "visualize" 参数的表单,所以我的操作不会处理它作为预览。所以我让jQuery点击右键而不是提交表单:

$('#visualize').click(function(e) {
  if (!$('#myForm').prop('target')) {
    e.preventDefault(); //prevents the default submit action
    $('#myForm').prop('target', '_blank');
    $('#visualize').click();
  }
  else {
    $('#myForm').prop('target', null);
  }
});

这还是不行。它只是以相同的方式提交表单 window.

好吧,我终于解决了这个问题,所以这是一个(肮脏但有效的)解决方案:

    $('#visualize').click(function(e) {
            e.preventDefault(); //prevents the default submit action
            var $form = $(this).closest('form');
            $('<input />').attr('type', 'hidden')
            .attr('name', "visualize")
            .attr('id', "visualizeTemp")
            .attr('value', "1")
            .appendTo($form);
            $form.prop('target', '_blank').submit().prop('target', '_self');
            $('#visualizeTemp').remove();
    });

基本上,我创建了一个与我的按钮 (visualize) 一样命名的整个临时隐藏 input,然后提交表单。然后,我只是删除我的临时 input.

作为旁注,我还偶然发现了 this issue when calling $form.submit() so I had to rename my submitting button:

<form id="myForm" action="somecontroller/action">
  <input type="text" name="someValue" />
  <input type="submit" id="visualize" value="Visualize" name="visualize" formTarget="_blank" />
  <input type="submit" value="Submit" name="save" />
</form>