【问题标题】:HTML input file onchange not triggering second time for different fileHTML输入文件onchange不会为不同的文件触发第二次
【发布时间】:2017-07-19 03:43:27
【问题描述】:

我看到很多关于输入文件元素第二次使用相同文件未触发onchange 事件的问题,但我的情况并非如此。 My onchange handler is not trigerred when a different file is selected too.

我选择了一个文件,然后如果我尝试选择另一个文件,它就不起作用了。文件选择对话框出现,我选择我的(不同的)文件,就是这样。第一次调用的onchange 处理程序不会再次调用。当我选择文件时没有任何反应。

这是我的 JS:

<input type="file" id="my-input" name="my-input" class="hidden" />

(在 jQuery 上): $("#my-input")[0].onchange = onSelectedFileChange;

function onSelectedFileChange(e) {
    file = e.target.files[0];
    handleFile(); //my code that processes the file, has nothing to do with the input element.
}

我也尝试在handleFile 方法中重新添加onchange(例如将$("#my-input")[0].onchange = onSelectedFileChange; 复制到其中),但它似乎也不起作用。选择文件后,我的输入法的onchange 属性设置为null,即使我再次显式设置它,它也会以某种方式保持为null。

为什么会发生这种情况?这恰好是跨浏览器的情况。

更新:这是handleFile 方法:

//file is in the global scope, from the previous method
function handleFile() {
    var lowerName = file.name.toLowerCase();
    if (lowerName.endsWith('.pdf') || lowerName.endsWith('.doc') || lowerName.endsWith('.docx')) {
        $("#file-name").text(file.name);
    } else {
        file = null;
        alert('Please select a valid file')
    }
}

【问题讨论】:

  • 使用 jQuery 的边注绑定事件:$("#my-input").on('change', onSelectedFileChange)
  • 你能显示handleFile()的代码吗?
  • 我已经运行了你的代码和 alert(file.name);很好地打印并触发每个更改的文件的事件。请显示您的 handleFile() 脚本。
  • @sayingu 我已将其添加到问题中。
  • @Can Poyrazoğlu 您的代码在我的测试中运行良好。什么时候不工作?

标签: javascript html file-upload html-input


【解决方案1】:

而不是使用

$("#my-input")[0].onchange = function

您可以使用 jquery 等效项

$("#my-input").change(function)

$("#my-input").on('change',function)

虽然它们都应该大致相同,但奇怪的是您的代码没有按照原来的方式运行。 您可以使用 '.on' 对其进行更改,使其也考虑使用动态添加的元素

$("body").on('change', '#my-input', onSelectedFileChange);

编辑

[0] 表示法确实选择了底层 DOM 元素,以便您可以使用 javascripts onchange(而不是 jquery 等效的 change())。 很可能在您的代码中更新了 DOM 元素(innerHTML 或类似元素),这导致它从 javascript 中丢失了 onchange 侦听器。

【讨论】:

  • $("#my-input")[0] 返回底层 DOM 元素,因此 OP 使用正确。但是首选使用 .on() 附加事件
  • 是的,正如@Satpal 刚才所说,我试图获取 DOM 元素而不是 jQuery 对象。我没有任何其他具有相同 ID 的元素。无论如何,您的解决方案有效,但我真的很想知道为什么我的解决方案不起作用。
  • @CanPoyrazoğlu aah 好的,在这种情况下 [0] 确实应该工作。您是动态添加输入还是更改输入的内部 html?因为那时 .on() 方法有效,但 js 版本只执行一次。 (见stackoverflow.com/questions/7179627/…
  • @BasvanStein 我没有动态添加它,它只是一个静态的、视觉隐藏的(使用 CSS)输入元素。唯一的事情是我间接触发它(出于视觉目的,显示另一个div并从div调用隐藏输入的点击事件)但我也尝试取消隐藏它并直接点击它,没有任何区别.
  • @CanPoyrazoğlu 你对动态元素是正确的,我已经编辑了我的答案以显示正确的信息。 (我的坏..)。
【解决方案2】:

我认为这里可能还有其他问题,因为在下面的 sn-p 警报框时,每次选择新文件时都会出现。

$("#my-input")[0].onchange = onSelectedFileChange;

function onSelectedFileChange(e) {
    file = e.target.files[0];
    alert('new file');
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="my-input" name="my-input" class="hidden" />

handleFile() 函数是否有可能第二次中断?

【讨论】:

  • handleFile 根本不接触输入元素。它只是读取file 对象并将其分配给一个变量,我也没有触及该对象内部的任何东西。如果用户点击上传,我只是存储它来读取名称并执行上传(这里不是这种情况)。
【解决方案3】:

像这样对您的代码稍作改动

$("#my-input").onchange = onSelectedFileChange;

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 2020-11-22
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2018-10-22
    • 2013-11-04
    相关资源
    最近更新 更多