先使用jQuery选择器获取到想要绑定click事件的img元素,然后可以直接绑定click方法,也可以通过bind方法绑定。这里详细介绍一下bind方法。jQuery 事件 - bind() 方法 —— 定义和用法
html中如何给图片添加点击事件的详解
bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数。
jQuery 事件 - bind() 方法 ——将事件和函数绑定到元素
规定向被选元素添加的一个或多个事件处理程序,以及当事件发生时运行的函数。
jQuery 事件 - bind() 方法——语法
1 $(selector).bind(event,data,function)
jQuery 事件 - bind() 方法——参数描述
event 必需。规定添加到元素的一个或多个事件。由空格分隔多个事件。必须是有效的事件。
data 可选。规定传递到函数的额外数据。
function 必需。规定当事件发生时运行的函数。
实例:
1 //直接给所有img标签绑定click事件
2 $("img").click(function(){
3 alert('你点击了图片');
4 })
5
6 //使用bind方法绑定click事件
7 $("img").bind("click",function(){
8 alert('你点击了图片');
9 })
Html 的img标签添加点击事件
1 package com.topnews;
2
3 import java.util.ArrayList;
4
5 import android.annotation.SuppressLint;
6 import android.app.Activity;
7 import android.app.Fragment;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.graphics.Bitmap;
11 import android.os.AsyncTask;
12 import android.os.Bundle;
13 import android.text.TextUtils;
14 import android.util.Log;
15 import android.view.View;
16 import android.view.ViewGroup.LayoutParams;
17 import android.webkit.WebChromeClient;
18 import android.webkit.WebSettings;
19 import android.webkit.WebView;
20 import android.webkit.WebViewClient;
21 import android.webkit.WebSettings.LayoutAlgorithm;
22 import android.widget.Button;
23 import android.widget.FrameLayout;
24 import android.widget.ProgressBar;
25 import android.widget.TextView;
26
27 import com.topnews.base.BaseActivity;
28 import com.topnews.bean.NewsEntity;
29 import com.topnews.service.NewsDetailsService;
30 import com.topnews.tool.BaseTools;
31 import com.topnews.tool.DataTools;
32 import com.topnews.tool.DateTools;
33
34 @SuppressLint("JavascriptInterface")
35 public class DetailsActivity extends BaseActivity {
36 private TextView title;
37 private ProgressBar progressBar;
38 private FrameLayout customview_layout;
39 private String news_url;
40 private String news_title;
41 private String news_source;
42 private String news_date;
43 private NewsEntity news;
44 private TextView action_comment_count;
45 WebView webView;
46
47 @Override
48 protected void onCreate(Bundle savedInstanceState) {
49 // TODO Auto-generated method stub
50 super.onCreate(savedInstanceState);
51 setContentView(R.layout.details);
52 setNeedBackGesture(true);// 设置需要手势监听
53 getData();
54 initView();
55 initWebView();
56 }
57
58 /* 获取传递过来的数据 */
59 private void getData() {
60 news = (NewsEntity) getIntent().getSerializableExtra("news");
61 news_url = news.getSource_url();
62 news_title = news.getTitle();
63 news_source = news.getSource();
64 news_date = 65DateTools.getNewsDetailsDate(String.valueOf(news.getPublishTime()));
66 }
67
68 private void initWebView() {
69 webView = (WebView) findViewById(R.id.wb_details);
70 LayoutParams params = new 71LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
72 if (!TextUtils.isEmpty(news_url)) {
73 WebSettings settings = webView.getSettings();
74 settings.setJavaScriptEnabled(true);// 设置可以运行JS脚本
75 // settings.setTextZoom(120);//Sets the text zoom of the page in
76 // percent. The default is 100.
77 settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
78 // settings.setUseWideViewPort(true); //打开页面时, 自适应屏幕
79 // settings.setLoadWithOverviewMode(true);//打开页面时, 自适应屏幕
80 settings.setSupportZoom(false);// 用于设置webview放大
81 settings.setBuiltInZoomControls(false);
82 webView.setBackgroundResource(R.color.transparent);
83 // 添加js交互接口类,并起别名 imagelistner
84 webView.addJavascriptInterface(new 85JavascriptInterface(getApplicationContext()), "imagelistner");
86 webView.setWebChromeClient(new MyWebChromeClient());
87 webView.setWebViewClient(new MyWebViewClient());
88 Log.i("info", "news_url:" + news_url);
89 Log.i("info", "news_title:" + news_title);
90 Log.i("info", "news_source:" + news_source);
91 Log.i("info", "news_date:" + news_date);
92 new MyAsnycTask().execute(news_url, news_title, news_source + " " + 93news_date);
94 }
95 }
96
97 private void initView() {
98 title = (TextView) findViewById(R.id.title);
99 progressBar = (ProgressBar) findViewById(R.id.ss_htmlprogessbar);
100 customview_layout = (FrameLayout) 101findViewById(R.id.customview_layout);
102 // 底部栏目
103 action_comment_count = (TextView) 104findViewById(R.id.action_comment_count);
105
106 progressBar.setVisibility(View.VISIBLE);
107 title.setTextSize(13);
108 title.setVisibility(View.VISIBLE);
109 title.setText(news_url);
110 action_comment_count.setText(String.valueOf(news.getCommentNum()));
111 }
112
113 @Override
114 public void onBackPressed() {
115 super.onBackPressed();
116 overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
117 }
118
119 private class MyAsnycTask extends AsyncTask<string, string,="" string=""> {
120
121 @Override
122 protected String doInBackground(String... urls) {
123 String data = NewsDetailsService.getNewsDetails(urls[0], urls[1], urls[2]);
124 Log.i("info", "MyAsnycTask.data:" + data);
125 return data;
126 }
127
128 @Override
129 protected void onPostExecute(String data) {
130 webView.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);
131 }
132 }
133
134 // 注入js函数监听
135 private void addImageClickListner() {
136 // 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,在还是执137 行的时候调用本地接口传递url过去
138 webView.loadUrl("javascript:(function(){" + "var objs = 139document.getElementsByTagName(\"img\");" + "var imgurl=''; "
140 + "for(var i=0;i<objs.length;i++) "="" +="" "{"="" 141"imgurl+="objs[i].src+',';"" objs[i].onclick="function()" {="" 142window.imagelistner.openimage(imgurl);="" }="" "}"="" "})()");="" js通信接口="" 143public="" class="" javascriptinterface="" private="" context="" context;="" 144javascriptinterface(context="" context)="" this.context="context;" void="" 145openimage(string="" img)="" string[]="" imgs="img.split(",");" 146arraylist<string=""> imgsUrl = new ArrayList<string>();
147 for (String s : imgs) {
148 imgsUrl.add(s);
149 Log.i("图片的URL>>>>>>>>>>>>>>>>>>>>>>>", s);
150 }
151 Intent intent = new Intent();
152 intent.putStringArrayListExtra("infos", imgsUrl);
153 intent.setClass(context, ImageShowActivity.class);
154 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
155 context.startActivity(intent);
156 }
157 }
158
159 // 监听
160 private class MyWebViewClient extends WebViewClient {
161 @Override
162 public boolean shouldOverrideUrlLoading(WebView view, String url) {
163 return super.shouldOverrideUrlLoading(view, url);
164 }
165
166 @Override
167 public void onPageFinished(WebView view, String url) {
168 view.getSettings().setJavaScriptEnabled(true);
169 super.onPageFinished(view, url);
170 // html加载完成之后,添加监听图片的点击js函数
171 addImageClickListner();
172 progressBar.setVisibility(View.GONE);
173 webView.setVisibility(View.VISIBLE);
174 }
175
176 @Override
177 public void onPageStarted(WebView view, String url, Bitmap favicon) {
178 view.getSettings().setJavaScriptEnabled(true);
179 super.onPageStarted(view, url, favicon);
180 }
181
182 @Override
183 public void onReceivedError(WebView view, int errorCode, String description, 184String failingUrl)
185 {
progressBar.setVisibility(View.GONE);
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
private class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
if (newProgress != 100) {
progressBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
}
}</string></objs.length;i++)></string,>
// NewsDetailsService.java
1 package com.topnews.service;
2
3 import java.io.IOException;
4 import org.jsoup.Jsoup;
5 import org.jsoup.nodes.Document;
6 import org.jsoup.nodes.Element;
7
8 import android.text.TextUtils;
9
10 public class NewsDetailsService {
11 public static String getNewsDetails(String url, String news_title,
12 String news_date) {
13 Document document = null;
14 String data = "" +
15 "<center><h2 style="'font-size:16px;'">" + news_title + "</h2></center>";
16 data = data + "<p align="'left'" style="'margin-left:10px'">"
17 + "<span style="'font-size:10px;'">"
18 + news_date
19 + "</span>"
20 + "</p>";
21 data = data + "<hr size="'1'">";
22 try {
23 document = Jsoup.connect(url).timeout(9000).get();
24 Element element = null;
25 if (TextUtils.isEmpty(url)) {
26 data = "";
27 element = document.getElementById("memberArea");
28 } else {
29 element = document.getElementById("artibody");
30 }
31 if (element != null) {
32 data = data + element.toString();
33 }
34 data = data + "";
35 } catch (IOException e) {
36 e.printStackTrace();
37 }
38 return data;
39 }
40 }
以上就是html中如何给图片添加点击事件的详解的详细内容,
一篇文章Stimulus:连接HTML和JavaScript的桥梁,实现简单的controller,并学习了Stimulus是如何连接HTML与JavaScript的。现在我们使用Stimulus来实现复制文本到粘贴板的按钮。
比如说,我们现在有一个需求,就是帮助用户生成密码,在密码旁边放置一个按钮,点击按钮后密码就被拷贝到粘贴板上了,这样就方便用户使用这个密码了。
打开public/index.html,修改body内容,填充一个简单的按钮,如下:
<div>
PIN: <input type="text" value="1234" readonly>
<button>Copy to Clipboard</button>
</div>
下一步,创建src/controllers/clipboard_controller.js,然后添加一个copy()方法:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
copy() {
}
}
然后,给div添加data-controller=“clipboard”。只要是给元素添加了data-controller属性,Stimulus就会连接一个controller实例。
<div data-controller="clipboard">
我们还需要一个对输入框的引用,这样我们就可以在调用粘贴板API之前获取输入框的内容。给文本框添加data-clipboard-target=“source“:
PIN: <input data-clipboard-target="source" type="text" value="1234" readonly>
在controller中定义一个target,然后就可以通过this.sourceTarget访问文本框了。
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = [ "source" ]
copy() {
}
}
解释一下这个targets:
当Stimulus加载你的controller类时,它会查看静态数组targets的字符串元素,对于每一个字符串,Stimulus会在controller中添加3个属性。在这里,对于“source”,会添加如下属性:
this.sourceTarget 在controller的域内的第一个source
this.sourceTargets 在controller的域内所有的source组成的一个数组
this.hasSourceTarget 在controller的域内是否有source
我们希望点击按钮时调用controller中的copy()方法,所以我们需要添加data-action=“clipboard#copy“
<button data-action="clipboard#copy">Copy to Clipboard</button>
你可以已经注意到在上面的动作描述符中省略了click->。那是因为Stimulus给button设置了click作为它默认的事件。
某些其他元素也有默认事件。下面是个全部列表:
元素 | 默认事件 |
a | click |
button | click |
details | toggle |
form | submit |
input | input |
input type=“submit” | click |
select | change |
textarea | input |
最终,在copy()方法中,我们获取输入框的内容,调用粘贴板API
copy() {
navigator.clipboard.writeText(this.sourceTarget.value)
}
刷新页面,点击按钮,然后快捷键粘贴到Greet按钮前到输入框,可以看到1234。
到目前为止,在页面上同一时间只有一个controller实例。在页面上同时有一个controller的多个实例也是很正常的。
我们的controller是可以复用的,只要你需要在页面上添加复制内容的按钮,无论是哪个页面,只要把对应的属性值写好,我们的controller都是生效的。
还是上面的例子,再添加另外一个复制按钮:
<div data-controller="clipboard">
PIN: <input data-clipboard-target="source" type="text" value="3737" readonly>
<button data-action="clipboard#copy" class="clipboard-button">Copy to Clipboard</button>
</div>
刷新页面,验证一下两个复制按钮是否都生效。
我们再添加一个可以复制的元素,不用button,我们用a标签,
<div data-controller="clipboard">
PIN: <input data-clipboard-target="source" type="text" value="6666" readonly>
<a href="#" data-action="clipboard#copy" class="clipboard-button">Copy to Clipboard</a>
</div>
Stimulus允许我们使用任何元素,只要它设置了合适的data-action属性,就可以触发复制。
这个例子里,要注意一点,点击链接会使浏览器追踪a标签内的href属性跳转,可以取消这种默认行为,只需要在action中调用 event.preventDefault()就可以了。
copy(event) {
event.preventDefault()
navigator.clipboard.writeText(this.sourceTarget.value)
}
还有另外一个方法,拷贝粘贴板上
copy(event) {
event.preventDefault()
this.sourceTarget.select()
document.execCommand("copy")
}
在本文中,我们看了一个在现实中把浏览器API包装在Stimulus的controller中的例子。还有一个controller的多个实例如何同时出现在页面上,我们还探索了actions和targets如何保持HTML和JavaScript的松散耦合。
下一篇文章,我们将优化一下这个复制粘贴板的功能,让它运行起来更加健壮。
Stimulus:浏览器不支持复制或者弱网条件下,怎么办?
助CSS提供的animation与transform及filter滤镜等属性,我们可以使用CSS设置出精美的动画效果,进一步可以使用CSS对HTML页面基本元素、图标等进行动画设计,如按钮效果,页面加载图标等。本文主要介绍加载图标动画设计,并进行实例分析。
CSS加载动画设计
本例设计实现自动旋转的加载图标设计,在图标旋转过程中,动态改变颜色与状态,实现效果如下所示:
动态加载loading设计效果
本例设计效果描述如上所示,一方面需要实现旋转效果,另一方面需要实现颜色变化,所需掌握知识点主要包括CSS滤镜filter,动画属性animation与@keyframes关键帧的定义等。各类所需基本语法说明如下:
1、flex布局
通过使用flex布局实现动画层在web页面中进行布局与定位,本例应用到justify-content属性与
align-items属性实现动画层在页面水平与垂直方向进行居中显示。
2、before与after伪元素
伪元素是在html文件代码中不存在的元素,但是其能够在网页浏览时表现出行为与效果,与真实存在的元素类似。其中before指在元素前加入的内容,after表示在元素后加入的内容。如我们在页面中定义一个DIV层,则可使用before在前前添加新的内容,显示不同效果。代码如下:
before元素使用实例
在该实例中我们在dv表示的层之前添加了一个新的层效果,即.dv:before所定义的部分,页面实际代码中只有一个黄色层,生成的伪元素层为绿色层,实现效果如下:
伪元素层效果
3、线性渐变与透明度渐变
CSS提供元素原色的渐变效果,主要渐变类型包括径向渐变与线性渐变。本例需要使用线性渐变实现背景效果。线性渐变(Linear Gradients)可以实现颜色渐变、透明的渐变等。如:
linear-gradient(0deg, blue, green 40%, red);
表示:从下到上,从蓝色开始渐变、到高度40%位置是绿色渐变开始、最后以红色结束;将其应用到我们伪元素定义案例中则可呈现如下效果:
伪元素层渐变效果
除使用以上方法实现渐变之外,还可以对透明度进行渐变设置,需要使用transparent参数表示透明。如:
linear-gradient(0deg,transparent,transparent 40%,red);则表示按照透明度进行渐变;
透明线性渐变效果如下图所示:
现性渐变效果展示
4、圆形DIV与边缘模糊设置
圆形DIV主要通过border-radius属性设置,当其值设置为50%时即可形成圆形,边缘模糊主要通过滤镜filter实现。使用blur()设置高斯模糊。实例效果如下所示:
圆形div与高斯模糊
本例实现效果描述如上图所示,其中外层div设置radius为50%,内层绿色部分设置高斯模糊。
5、动画与旋转基本知识
动画效果主要通过animation属性与@keyframes进行设置,前文已经进行了说明,本文不再详细说明,如需阅读,请自行查阅。
旋转的加载动态效果基于以上基本语法进行设计与开发,实现主要代码表述如下:
本例实现完整代码
本头条号长期关注编程资讯分享;编程课程、素材、代码分享及编程培训。如果您对以上方面有兴趣或代码错误、建议与意见,可在评论区回复。更多程序设计相关教程及实例分享,期待大家关注与阅读!
*请认真填写需求信息,我们会在24小时内与您取得联系。