当前位置: 首页 > 知识库问答 >
问题:

javascript - 这段js脚本中的图片click事件无效?

何建中
2024-04-01

自己写的一个在不同搜索引擎间快速跳转的脚本,image的click事件无效。

// ==UserScript==// @name         快速切换搜索// @namespace    https://viayoo.com/// @version      0.1// @description  try to take over the world!// @author       You// @run-at       document-start// @match        *baidu.com*// @match        *bing.com*// @match        *google.com*// @match        *so.com*// @match        *sogou.com*// @grant        none// ==/UserScript==(function() {'use strict';// 创建浮动框var floatingBox = document.createElement('div');floatingBox.style.cssText = 'position: fixed; bottom: 20px; width: 400px; height: 220px; background-color: rgba(0, 0, 0, 0.5); border: 1px solid #ffffff; border-radius: 5px; z-index: 9999; cursor: move; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 10px; left: 50%; transform: translateX(-50%); text-align: center;';// 创建第一个图像元素var image1 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico')// 创建第二个图像元素var image2 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico');// 创建第三个图像元素var image3 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico');// 创建第四个图像元素var image4 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico');// 创建图像元素的函数,接受图片链接和点击事件处理函数作为参数function createImage(src) {  var image = document.createElement('img');  image.src = src;  image.style.width = '50px';  image.style.height = '50px';  image.style.cursor = 'pointer';  image.style.display = 'block'; // 设置图片为块级元素  image.style.margin = '0 auto'; // 居中图片  return image;}function bing() { // (www|m).baidu.com,无论是手机ua还是电脑ua都是document.getElementById('kw').value  if (/baidu\.com/.test(location.host)) {    let value = document.getElementById('kw')      .value;    let url = 'http://cn.bing.com/search?q=';    location.assign(url + value);  }  // sogou是按域名区分的  // m.sogou.com document.getElementById('keyword').value  // www.sogou.com document.getElementById('upquery').value  if (/m\.sogou\.com/.test(location.host)) {    let value = document.getElementById('keyword')      .value;    let url = 'http://cn.bing.com/search?q=';    location.assign(url + value);  }  if (/www\.sogou\.com/.test(location.host)) {    let value = document.getElementById('upquery')      .value;    let url = 'http://cn.bing.com/search?q=';    location.assign(url + value);  }  // google的都是document.querySelector('textarea[name="q"]').value  if (/google\.[a-z]{2,3}/.test(location.host)) {    let value = document.querySelector('textarea[name="q"]')      .value;    let url = 'http://cn.bing.com/search?q=';    location.assign(url + value);  }  // yahoo document.querySelector('input[name=p]').value  if (/yahoo\.com/.test(location.host)) {    let value = document.querySelector('input[name=p]')      .value;    let url = 'http://cn.bing.com/search?q=';    location.assign(url + value);  }  // so.com document.querySelector('input[name=q]').value  if (/\.so\.com/.test(location.host)) {    let value = document.querySelector('input[name=q]')      .value;    let url = 'http://cn.bing.com/search?q=';    location.assign(url + value);  }}function baidu() {  // bing.com document.querySelector('[name=q]').value  if (/bing\.com/.test(location.host)) {    let value = document.querySelector('[name=q]')      .value;    let url = 'http://www.baidu.com/s?tn=baidu&rn=50&wd=';    location.assign(url + value);  }  // sogou是按域名区分的  // m.sogou.com document.getElementById('keyword').value  // www.sogou.com document.getElementById('upquery').value  if (/m\.sogou\.com/.test(location.host)) {    let value = document.getElementById('keyword')      .value;    let url = 'http://www.baidu.com/s?tn=baidu&rn=50&wd=';    location.assign(url + value);  }  if (/www\.sogou\.com/.test(location.host)) {    let value = document.getElementById('upquery')      .value;    let url = 'http://www.baidu.com/s?tn=baidu&rn=50&wd=';    location.assign(url + value);  }  // google的都是document.querySelector('textarea[name="q"]').value  if (/google\.[a-z]{2,3}/.test(location.host)) {    let value = document.querySelector('textarea[name="q"]')      .value;    let url = 'http://www.baidu.com/s?tn=baidu&rn=50&wd=';    location.assign(url + value);  }  // yahoo document.querySelector('input[name=p]').value  if (/yahoo\.com/.test(location.host)) {    let value = document.querySelector('input[name=p]')      .value;    let url = 'http://www.baidu.com/s?tn=baidu&rn=50&wd=';    location.assign(url + value);  }  // so.com document.querySelector('input[name=q]').value  if (/\.so\.com/.test(location.host)) {    let value = document.querySelector('input[name=q]')      .value;    let url = 'http://www.baidu.com/s?tn=baidu&rn=50&wd=';    location.assign(url + value);  }}// 为每个图像元素添加点击事件监听器image1.addEventListener('click', bing);image2.addEventListener('click', bing);image3.addEventListener('click', bing);image4.addEventListener('click', bing);// 将图像元素添加到浮动框中floatingBox.appendChild(image1);floatingBox.appendChild(image2);floatingBox.appendChild(image3);floatingBox.appendChild(image4);// 添加到页面document.body.appendChild(floatingBox);// 触摸开始事件处理函数function touchStartHandler(e) {  // 阻止默认滚动行为  e.preventDefault();  // 获取触摸点在浮动框内的位置  var touch = e.touches[0];  var offsetX = touch.clientX - floatingBox.offsetLeft;  var offsetY = touch.clientY - floatingBox.offsetTop;  // 触摸移动事件处理函数  function touchMoveHandler(e) {    // 阻止默认滚动行为    e.preventDefault();    // 设置浮动框的位置    var touch = e.touches[0];    floatingBox.style.left = (touch.clientX - offsetX) + 'px';    floatingBox.style.top = (touch.clientY - offsetY) + 'px';  }  // 触摸结束事件处理函数  function touchEndHandler() {    // 移除事件监听器    document.removeEventListener('touchmove', touchMoveHandler);    document.removeEventListener('touchend', touchEndHandler);  }  // 添加触摸移动和结束事件监听器  document.addEventListener('touchmove', touchMoveHandler);  document.addEventListener('touchend', touchEndHandler);}// 添加触摸开始事件监听器floatingBox.addEventListener('touchstart', touchStartHandler);})()

把function单独粘贴到控制台运行是正常的,但是全部粘贴到控制台后图片的点击事件就没有生效,也没报错。。。询问chatgpt也没给出有效方案。

共有3个答案

鲁乐
2024-04-01

你难道都没发现,你的脚本都没加载吗

// @run-at       document-end// @match        *://baidu.com/*// @match        *://*.baidu.com/*// @match        *://bing.com/*// @match        *://*.bing.com/*// @match        *://google.com/*// @match        *://*.google.com/*// @match        *://so.com/*// @match        *://*.so.com/*// @match        *://sogou.com/*// @match        *://*.sogou.com/*
锺博耘
2024-04-01

测试了一下是@match没有匹配上页面地址,改过来就能加载脚本了

# 不能匹配// @match         *baidu.com*# 匹配// @match         https://www.baidu.com/*
龙学
2024-04-01

您的脚本在创建图像元素时,没有将图像元素添加到DOM中,因此这些图像元素上的点击事件监听器无法被触发。您需要在创建图像元素后,将它们添加到DOM中,然后再为它们添加点击事件监听器。

在您的代码中,您创建了一个floatingBox元素,并试图将所有图像元素添加到这个浮动框中。然后,您再将floatingBox添加到document.body中。但是,您在添加图像元素到floatingBox之前,就为它们添加了点击事件监听器。因此,这些监听器是在图像元素还没有被添加到DOM中时添加的,所以它们无法工作。

要解决这个问题,您应该在将图像元素添加到floatingBox之后,再为它们添加点击事件监听器。这是修改后的代码片段:

// 创建图像元素的函数,接受图片链接和点击事件处理函数作为参数function createImage(src, callback) {  var image = document.createElement('img');  image.src = src;  image.style.width = '50px';  image.style.height = '50px';  image.style.cursor = 'pointer';  image.style.display = 'block'; // 设置图片为块级元素  image.style.margin = '0 auto'; // 居中图片  image.addEventListener('click', callback); // 在添加到DOM后添加点击事件监听器  return image;}// 创建图像元素var image1 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico', bing);var image2 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico', bing);var image3 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico', bing);var image4 = createImage('https://ms.bdstatic.com/se/static/wiseindex/img/favicon64_587c374.ico', bing);// 将图像元素添加到浮动框中floatingBox.appendChild(image1);floatingBox.appendChild(image2);floatingBox.appendChild(image3);floatingBox.appendChild(image4);

这样,当图像元素被添加到floatingBox中时,它们的点击事件监听器就已经被添加到了DOM中,因此可以被正确触发。

 类似资料:
  • 我尝试过的事情 我尝试为放一个,但没有成功。因为它永远不会被初始化。 我将并使用null safe运算符但无法获取click事件。 我是相当新的Kotlin和碎片太,所以请帮助我如何做到这一点。谢谢

  • 问题内容: 我想知道调用WebElement的方法与通过id查找元素并使用JavaScript 触发事件之间有什么区别。 为了清楚起见,在第一种方法中,我调用了WebElement实例: 第二种技术是: 我有兴趣了解这两种单击Web元素的技术之间的所有差异,以及每种技术的优缺点。 问题答案: Webdriver 利用浏览器的本机支持,使用id / xpath等将DOM元素映射到WebElement

  • 对于我的项目,我正在尝试通过单击每张图片下的“查看注释”来显示图片注释。问题是当我点击查看一张图片的评论时,它会触发并打开所有图片的“查看评论”部分。有人能帮忙吗! jQuery: HTML:

  • 该事件发生在用户单击CommandBarButton 对象时。 Private Sub CommandBarButton_Click (ByVal Ctrl As CommandBarButton, ByVal CancelDefault As Boolean) Click 事件的语法中包含两个参数,下表中列出了对这两个参数的说明。参数说明CtrlCommandBarButton 类型,必需。指示

  • 本文向大家介绍wap图片滚动特效无css3元素纯js脚本编写,包括了wap图片滚动特效无css3元素纯js脚本编写的使用技巧和注意事项,需要的朋友参考一下 手机图片滑动切换,网上有很多这样的例子,但都借助于其他组件,让代码混乱的不行;还有就是用到css3里的 transform:translate(x,y);移动元素,不过发现在不支持css3的设备上马上完蛋了,所以下定决心自己做一个,谁知出现了很

  • 本文向大家介绍Javascript中click与blur事件的顺序详析,包括了Javascript中click与blur事件的顺序详析的使用技巧和注意事项,需要的朋友参考一下 一、现象 最近在开发中碰到了一个需求,具体需求如下图。 这是一个很常见的需求,input框负责在点击回车和失焦的时候确认输入。button负责清除输入,input绑定代码为: "X"绑定的代码为: 尝试着执行代码,并按照先输