在Google Chrome扩展程序页面上触发"onchange"事件

 胡印鉴_473 发布于 2023-02-12 19:45

我正在开发一个扩展,使用来自其他网站的数据自动填充表单.我有一个具有不同选项的上下文菜单,每个选项都有不同的数据,但完成相同的表单.数据是动态的,取决于其他网站.使用"chrome.tabs.executeScript"我可以插入一些数据,但我无法触发事件"onchange"的字段.可以更改选择的值,但网站有一个事件"onchange",当我更改值时不会触发,而不是通过"chrome.tabs.executeScript"运行"onchange".它显示的错误是:"未捕获的TypeError:对象#的属性'onchange'不是函数#HTMLSelectElement"

编辑:

manifest.json的:

"content_scripts": [
    {
        "matches": ["url_where_the_code_must_run"],
        "js": ["billing.class.js", "script.js"]
    }
],
.
.
.

"permissions": [
    "tabs",
    "url_from_where_i_get_the_data",
    "url_where_the_code_must_run"
],

的script.js:

select = document.createElement('select');
var option = document.createElement('option');
option.value = "";
option.innerHTML = "Select Client";
select.appendChild(option);
select.onchange = function() {
    var client = Billing.getClient(this.value);
    if (client) {
        document.getElementsByName("country")[0].value = client.country_id;
        document.getElementsByName("country")[0].onchange();
    }
}
for (var i = 0; i < Billing.clients.length; i++) {
    option = document.createElement('option');
    option.value = Billing.clients[i].id;
    option.innerHTML = Billing.clients[i].name;
    select.appendChild(option);
}

form.parentElement.insertBefore(select, form);

执行此行时,显示"未捕获的TypeError:对象#的属性'onchange'不是函数#HTMLSelectElement":

document.getElementsByName("country")[0].onchange();

但是,如果我直接在控制台中运行此行,通常运行没有错误

document.getElementsByName("country")[0]是url的元素,"select"是我在扩展中创建的元素,用于选择应加载的客户端数据.

url_where_the_code_must_run:



Max K.. 8

您是否尝试过发布事件而不是直接调用该函数?据我记忆,直接调用事件处理程序可能会产生副作用.我现在找不到消息来源.

尝试更换

document.getElementsByName("country")[0].onchange();

var changeEvent = document.createEvent("HTMLEvents");
changeEvent.initEvent("change", true, true);
document.getElementsByName("country")[0].dispatchEvent(changeEvent);

我也创造了一个小小提琴:http://jsfiddle.net/d94Xb/1/

此外,你可能会考虑addEventListener(),并dispatchEvent()多一点,因为这是注册并执行事件处理的常用方法.


(更新:2015-04-27)现在,@ 10basetom指出,上述方法已被弃用.更好的方法是使用Event().请注意,这在IE和Safari中无效.

1 个回答
  • 您是否尝试过发布事件而不是直接调用该函数?据我记忆,直接调用事件处理程序可能会产生副作用.我现在找不到消息来源.

    尝试更换

    document.getElementsByName("country")[0].onchange();
    

    var changeEvent = document.createEvent("HTMLEvents");
    changeEvent.initEvent("change", true, true);
    document.getElementsByName("country")[0].dispatchEvent(changeEvent);
    

    我也创造了一个小小提琴:http://jsfiddle.net/d94Xb/1/

    此外,你可能会考虑addEventListener(),并dispatchEvent()多一点,因为这是注册并执行事件处理的常用方法.


    (更新:2015-04-27)现在,@ 10basetom指出,上述方法已被弃用.更好的方法是使用Event().请注意,这在IE和Safari中无效.

    2023-02-12 19:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有