在css中,伪元素的content是能读取到data属性的。
也就是说我们可以这样写css:
p.change:after { ?? ?content: attr(data-content); }
js文件
$(this).addClass('change').attr('data-content', content);
这样你就可以随意改动了。
在css中,伪元素的content是能读取到data属性的。
也就是说我们可以这样写css:
p.change:after { ?? ?content: attr(data-content); }
js文件
$(this).addClass('change').attr('data-content', content);
这样你就可以随意改动了。
需要jquery支持
//创建ajax类 function ajaxobj(){ this.url=""; this.data=""; this.type="post"; this.async=true;//true:同步 false:异步 this.success;//成功时执行 this.error;//失败时执行 this.complete=function(XHR,TextStatus){//完成时执行 if(XHR.statusText!="OK"){ if(typeof this.error == "function"){this.error();} console.warn(that.url+"->"+XHR.statusText) } }; this.timeout=120000;//120秒超时 this.send=function(){ $.ajax(this); } } function ajax(url,_post,callback,error){ var _ajax = new ajaxobj(); _ajax.url=url; _ajax.data=_post; _ajax.success=callback; _ajax.error=error; _ajax.send(); }
原生js ajax
来源http://www.cnblogs.com/a757956132/p/5603176.html
/* 封装_ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的 * @param {object}opt.data 发送的参数,格式为对象类型 * @param {function}opt.success ajax发送并接收成功调用的回调函数 */ function _ajax(opt) { opt = opt || {}; opt.method = opt.method.toUpperCase() || 'POST'; opt.url = opt.url || ''; opt.async = opt.async || true; opt.data = opt.data || null; opt.success = opt.success || function () {}; opt.error = opt.error|| function () {}; var xmlHttp = null; if (XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } else { xmlHttp = new ActiveXObject('Microsoft.XMLHTTP'); }var params = []; for (var key in opt.data){ params.push(key + '=' + opt.data[key]); } var postData = params.join('&'); if (opt.method.toUpperCase() === 'POST') { xmlHttp.open(opt.method, opt.url, opt.async); xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); xmlHttp.send(postData); } else if (opt.method.toUpperCase() === 'GET') { xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async); xmlHttp.send(null); } xmlHttp.onreadystatechange = function () { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { opt.success(xmlHttp.responseText); } if(xmlHttp.readyState == 4 && xmlHttp.status != 200){ opt.error(xmlHttp); console.warn(`[${opt.method}]${opt.url} -> ${xmlHttp.status}-${xmlHttp.statusText}`) } }; } /** * 我喜欢的样子 */ function ajax(url,_post,callback,error){ _ajax({ method: 'POST', url: url, data: _post, success: function (response) { callback(response); }, error: error }); }
来源:http://www.thinkphp.cn/topic/23989.html
1在控制器里定义一个方法来生成验证码:
public function selfverify(){
$verify = new \Think\Verify($config);
$verify->entry();
}
2模板里面引用验证码:
<IMG onclick="this.src=this.src+'?'+Math.random()" src="{:U('login/selfverify')}" >
注:onclick="this.src=this.src+'?'+Math.random()"意思是点验证码是自已刷新一下.
注:src="{:U('login/selfverify')}" 意思是验证码图的地址是:login控制器下面的selfverify方法
注:src="{:U('login/selfverify')}" 可以用 src="__URL__/selfverify"来代替,效果是一样的
3验证码的校验
在应用的公共模块Application\Common\Common里面的function.php中或自已控制器内写一个校验方法:
function check_verify($code,$id=''){
$verify = new \Think\Verify();
return $verify->check($code,$id);
}
问题:
$this->redirect("Index/index",i("get"),3,"不在规定网站内执行,正在跳转主页");显示乱码
解决:
在Thinkphp/Common/functions.php ?找到 ?redirect函数
添加
header("Content-type:text/html;charset=utf-8");
来源:http://www.cnblogs.com/A-Song/archive/2011/12/14/2288215.html
#测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br>"; #localhost //获取网页地址 echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php //获取网址参数 echo $_SERVER["QUERY_STRING"]."<br>"; #id=5 //获取用户代理 echo $_SERVER['HTTP_REFERER']."<br>"; //获取完整的url echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; #http://localhost/blog/testurl.php?id=5 //包含端口号的完整url echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; #http://localhost:80/blog/testurl.php?id=5 //只取路径 $url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; echo dirname($url); #http://localhost/blog
类方法
//去除左右空格 String.prototype.trim=function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); } //去除左空格 String.prototype.ltrim=function(){ return this.replace(/(^\s*)/g,""); } //去除右空格 String.prototype.rtrim=function(){ return this.replace(/(\s*$)/g,""); }
函数
function trim(str){ //删除左右两端的空格 return str.replace(/(^\s*)|(\s*$)/g, ""); } function ltrim(str){ //删除左边的空格 return str.replace(/(^\s*)/g,""); } function rtrim(str){ //删除右边的空格 return str.replace(/(\s*$)/g,""); }
Modal 属性
**m_系列——文字描述、内容类
//模态框抬头标题
Modal.m_title="string";
//模态框内容区域
Modal.m_body="string";//支持html对象
//模态框id
Modal.m_id="string";
**set_系列——执行函数类
//生成模态框底部按钮
Modal.set_btn({"string":callback})//按钮文字、执行函数
**基础系列
//弹出模态框
Modal.create()
//关闭模态框
Modal.close()
//模态框 function CreateModal(){ this.m_title="默认模态框"; this.m_body="默认内容"; this.m_id="newmodal"; this.m_target="body"; this.btn=[]; this.set_btn=function(data){ var btnarr=[]; for(var key in data){ var btn = document.createElement("button"); btn.className="btn btn-primary"; btn.onclick=data[key]; btn.innerHTML=key; this.btn.push(btn); } } this.close=function(){ $(".modal.fade").remove(); $(".modal-backdrop.fade").remove(); } this.create=function(){ this.close(); var modal_block = document.createElement("div"); modal_block.className = "modal fade"; modal_block.id = this.m_id; modal_block.setAttribute("data-show","true") var modal_dialog = document.createElement("div"); modal_dialog.className="modal-dialog modal-lg"; var modal_content = document.createElement("div"); modal_content.className="modal-content"; var modal_head = document.createElement("div"); modal_head.className= "modal-header"; var btn_close = document.createElement("button"); btn_close.className="close"; btn_close.type="button"; btn_close.innerHTML="×"; btn_close.addEventListener("click",this.close); modal_head.appendChild(btn_close); var modal_head_p = document.createElement("h4"); modal_head_p.innerHTML=this.m_title; modal_head.appendChild(modal_head_p); modal_content.appendChild(modal_head); var modal_body = document.createElement("div"); modal_body.className="modal_body"; if(typeof(this.m_body)=="string"){ modal_body.innerHTML=this.m_body; }else{ modal_body.appendChild(this.m_body); } modal_content.appendChild(modal_body); var modal_footer =document.createElement("div"); modal_footer.className="modal-footer"; this.btn.map(function(btns,index){ modal_footer.appendChild(btns); }) modal_content.appendChild(modal_footer); modal_dialog.appendChild(modal_content); modal_block.appendChild(modal_dialog); $(this.m_target).append(modal_block); $("#"+this.m_id).modal('show'); } }
select column_name,column_comment from information_schema.COLUMNS where table_name = 'capture_config';
result
id | id |
site | 网站 |
page | 页面 |
classify | 类别 |
title | 类别标题 |
rule | 获取规则 |
manifest
{ "name":"Catch your Data", "description":"Catch every data what you need", "version":"1.0", "permissions": [ "tabs", "http://*/*", "https://*/*","http://service.miniice.cn/","storage"//storage必须有,储存权限 ], "browser_action": { "default_title": "Get this page's Data.", "default_icon": "icon.png", "default_popup": "popup.html" }, "manifest_version":2, "content_scripts": [ { "js":["jquery-2.2.0.min.js","getnumber.js"], "matches":["https://sycm.taobao.com/portal/*"]//权限设置,可不设 } ], "background": { "scripts": ["jquery-2.2.0.min.js","ajax.js"] }, "options_page":"options.html" }
background - ajax.js
$.post("data.php","",function(ret){ console.log(ret); chrome.storage.sync.set(ret, function(){ //do something console.log("缓存成功") }); })
content_scripts ?getnumber.js
chrome.storage.sync.get(null,function(result){ console.log(result); })
注入js来源:http://www.2cto.com/article/201307/225986.html
发送ajax来源:http://www.cnblogs.com/onlyfu/p/4458025.html
manifest.json 内容
知识点包含:
* content_scripts注入js,background.scripts用来发送请求(content_scripts禁止发送ajax)
* Message 和 Request 区别
manifest
{ "name":"Catch your Data", "description":"Catch every data what you need", "version":"1.0", "permissions": [ "tabs", "http://*/*", "https://*/*","http://service.miniice.cn/" ], "browser_action": { "default_title": "Get this page's Data.", "default_icon": "icon.png", "default_popup": "popup.html" }, "manifest_version":2, "content_scripts": [ { "js":["jquery-2.2.0.min.js","content_script.js"], "matches":["https://sycm.taobao.com/portal/*"] } ], "background": { "scripts": ["jquery-2.2.0.min.js","background.js"] } }
标签脚本(content_script)和背景页(background)交互可以有多种方式
其中我使用过 Message 和 Request
Message用于立即响应消息,多用于读取早已缓存的信息,不适合异步
Request多用于异步请求服务器
var jsonarr={ 'name':'abc' } chrome.extension.sendMessage(jsonarr, function(ret){ console.log(ret); });
chrome.extension.onMessage.addListener(function(objRequest, _, sendResponse){ var send={ "data":objRequest, "info":"以上是您输入的信息", "status":1, } sendResponse(send); });
var jsonarr={ 'version':'abc123' } chrome.extension.sendRequest(jsonarr, function(ret){ console.log(ret); });
chrome.extension.onRequest.addListener(function(objRequest, _, sendResponse){ $.post("deal.php",objRequest,function(ret){ sendResponse(ret); }) });