.NET下為百度文本編輯器UEditor增加圖片刪除功能示例
百度的這個(gè)編輯器,的確挺好,但也有些,讓人不如意的,如每次更新,本來(lái)有功能給搞沒(méi)了,舊版本的代碼又不能直接拿過(guò)來(lái)組合用,對(duì)用戶來(lái)很是不爽。今天下載了目前最新版1.2.5為版本看更新記錄,主要是對(duì)表格做個(gè)修改,我下載用上,上傳圖片的刪除功能給取消了。把舊版本的刪除代碼拿過(guò)來(lái),不好使,還得我慢慢研究,鬧心啊,鬧心,折磨我半天。
1、首先修改服務(wù)器端ueditor\net下的文件imageManager.ashx,增加圖片刪除的處理。如下代碼的Add部分所示:
<%@ WebHandler Language="C#" Class="imageManager" %>
/**
* Created by visual studio2010
* User: xuheng
* Date: 12-3-7
* Time: 下午16:29
* To change this template use File | Settings | File Templates.
*/
using System;
using System.Web;
using System.IO;
using System.Text.RegularExpressions;
public class imageManager : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string[] paths = { "upload", "upload1" }; //需要遍歷的目錄列表,最好使用縮略圖地址,否則當(dāng)網(wǎng)速慢時(shí)可能會(huì)造成嚴(yán)重的延時(shí)
string[] filetype = { ".gif", ".png", ".jpg", ".jpeg", ".bmp" }; //文件允許格式
string action = context.Server.HtmlEncode(context.Request["action"]);
if (action == "get")
{
String str = String.Empty;
foreach (string path in paths)
{
DirectoryInfo info = new DirectoryInfo(context.Server.MapPath(path));
//目錄驗(yàn)證
if (info.Exists)
{
DirectoryInfo[] infoArr = info.GetDirectories();
foreach (DirectoryInfo tmpInfo in infoArr)
{
foreach (FileInfo fi in tmpInfo.GetFiles())
{
if (Array.IndexOf(filetype, fi.Extension) != -1)
{
str += path+"/" + tmpInfo.Name + "/" + fi.Name + "ue_separate_ue";
}
}
}
}
}
context.Response.Write(str);
}
//Add Start========================================================== 2013-05-12
//刪除選中的文件
string pathDel = string.Empty; //最好使用縮略圖地址,否則當(dāng)網(wǎng)速慢時(shí)可能會(huì)造成嚴(yán)重的延時(shí)
string fileName = context.Server.HtmlEncode(context.Request["fileName"]);
bool isDeleted = false;
if (action == "del")
{
try
{
String fullPath = String.Empty;
foreach (string path in paths)
{
pathDel = context.Server.MapPath(path);
DirectoryInfo info = new DirectoryInfo(pathDel);
//目錄驗(yàn)證
if (info.Exists)
{
//獲得C:\...\ueditor\net\upload目錄下,以時(shí)間命名的目錄。如:2013-05-12
DirectoryInfo[] infoArr = info.GetDirectories();
foreach (DirectoryInfo tmpInfo in infoArr)
{
foreach (FileInfo fi in tmpInfo.GetFiles())
{
//判斷是否是指定的圖片類型,因?yàn)殚L(zhǎng)傳的附件和圖片在同一個(gè)目錄
if (Array.IndexOf(filetype, fi.Extension) != -1)
{
if (fi.Name.Equals(fileName))
{
fullPath = pathDel + "/" + tmpInfo.Name + "/"+ fileName;
File.Delete(fullPath);
isDeleted = true;
break;
}
}
}
//已經(jīng)刪除,往外跳出
if (isDeleted == true)
break;
}
}
//已經(jīng)刪除,往外跳出
if (isDeleted == true)
break;
}
isDeleted = false;
context.Response.Write("success");
}
catch
{
context.Response.Write("error");
}
}
//Add End============================================================ 2013-05-12
}
public bool IsReusable
{
get
{
return false;
}
}
}
2、修改腳本ueditor\dialogs\image下的image.js文件。增加圖片刪除的處理的Ajax調(diào)用。如下的Add部分所示:
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-01-08
* Time: 下午2:52
* To change this template use File | Settings | File Templates.
*/
var imageUploader = {},
flashObj = null,
postConfig=[];
(function () {
var g = $G,
ajax = parent.baidu.editor.ajax,
maskIframe = g("maskIframe"); //tab遮罩層,用來(lái)解決flash和其他dom元素的z-index層級(jí)不一致問(wèn)題
// flashObj; //flash上傳對(duì)象
var flagImg = null, flashContainer;
imageUploader.init = function (opt, callbacks) {
switchTab("imageTab");
createAlignButton(["remoteFloat", "localFloat"]);
createFlash(opt, callbacks);
var srcImg = editor.selection.getRange().getClosedNode();
if (srcImg) {
showImageInfo(srcImg);
showPreviewImage(srcImg, true);
var tabElements = g("imageTab").children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for (var i = 0, ci; ci = tabHeads[i++];) {
if (ci.getAttribute("tabSrc") == "remote") {
clickHandler(tabHeads, tabBodys, ci);
}
}
}
addUrlChangeListener();
addOKListener();
addScrollListener();
addSearchListener();
$focus(g("url"));
};
imageUploader.setPostParams = function(obj,index){
if(index===undefined){
utils.each(postConfig,function(config){
config.data = obj;
})
}else{
postConfig[index].data = obj;
}
};
function insertImage(imgObjs) {
editor.fireEvent('beforeInsertImage', imgObjs);
editor.execCommand("insertImage", imgObjs);
}
function searchImage() {
var imgSearchInput = $G("imgSearchTxt");
if (!imgSearchInput.getAttribute("hasClick") || !imgSearchInput.value) {
selectTxt(imgSearchInput);
return;
}
g("searchList").innerHTML = "<p class='msg'>" + lang.imageLoading + "</p>";
var key = imgSearchInput.value,
type = $G("imgType").value,
url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + encodeToGb2312(key) + type + "&" + +new Date;
var reqCallBack = function (data) {
try {
var imgObjs = data.data;
} catch (e) {
return;
}
var frg = document.createDocumentFragment();
if (imgObjs.length < 2) {
g("searchList").innerHTML = "<p class='msg'>" + lang.tryAgain + "</p>";
return;
}
for (var i = 0, len = imgObjs.length; i < len - 1; i++) {
var img = document.createElement("img"), obj = imgObjs[i], div = document.createElement("div");
img.src = obj.objURL; //obj.thumbURL 為縮略圖,只能針對(duì)百度內(nèi)部使用
img.setAttribute("sourceUrl", obj.objURL);
var title = obj.fromPageTitleEnc.replace(/^\.\.\./i, "");
img.setAttribute("title", lang.toggleSelect + obj.width + "X" + obj.height);
img.onclick = function () {
changeSelected(this);
};
scale(img, 100, obj.width, obj.height);
div.appendChild(img);
var p = document.createElement("p");
p.innerHTML = "<a target='_blank' href='" + obj.fromURL + "'>" + title + "</a>";
div.appendChild(p);
//setTimeout(function(){
frg.appendChild(div);
//},0);
}
g("searchList").innerHTML = "";
g("searchList").appendChild(frg);
};
baidu.sio.callByServer(url, reqCallBack, {charset:"GB18030"});
}
function selectTxt(node) {
if (node.select) {
node.select();
} else {
var r = node.createTextRange && node.createTextRange();
r.select();
}
}
function addSearchListener() {
g("imgSearchTxt").onclick = function () {
selectTxt(this);
this.setAttribute("hasClick", true);
if (this.value == lang.searchInitInfo) {
this.value = "";
}
};
g("imgSearchTxt").onkeyup = function () {
this.setAttribute("hasClick", true);
//只觸發(fā)一次
this.onkeyup = null;
};
g("imgSearchBtn").onclick = function () {
searchImage();
};
g("imgSearchReset").onclick = function () {
var txt = g("imgSearchTxt");
txt.value = "";
txt.focus();
g("searchList").innerHTML = "";
};
g("imgType").onchange = function () {
searchImage();
};
domUtils.on(g("imgSearchTxt"), "keyup", function (evt) {
if (evt.keyCode == 13) {
searchImage();
}
})
}
/**
* 延遲加載
*/
function addScrollListener() {
g("imageList").onscroll = function () {
var imgs = this.getElementsByTagName("img"),
top = Math.ceil(this.scrollTop / 100) - 1;
top = top < 0 ? 0 : top;
for (var i = top * 5; i < (top + 5) * 5; i++) {
var img = imgs[i];
if (img && !img.getAttribute("src")) {
img.src = img.getAttribute("lazy_src");
img.removeAttribute("lazy_src");
}
}
}
}
/**
* 綁定確認(rèn)按鈕
*/
function addOKListener() {
dialog.onok = function () {
var currentTab = findFocus("tabHeads", "tabSrc");
switch (currentTab) {
case "remote":
return insertSingle();
break;
case "local":
return insertBatch();
break;
case "imgManager":
return insertSearch("imageList");
break;
case "imgSearch":
return insertSearch("searchList", true);
break;
}
};
dialog.oncancel = function () {
hideFlash();
}
}
function hideFlash() {
flashObj = null;
flashContainer.innerHTML = "";
}
/**
* 將元素id下的所有圖片文件到編輯器中。
* @param id
* @param catchRemote 是否需要替換遠(yuǎn)程圖片
*/
function insertSearch(id, catchRemote) {
var imgs = $G(id).getElementsByTagName("img"), imgObjs = [];
for (var i = 0, ci; ci = imgs[i++];) {
if (ci.getAttribute("selected")) {
var url = ci.getAttribute("src", 2).replace(/(\s*$)/g, ""), img = {};
img.src = url;
img.data_ue_src = url;
imgObjs.push(img);
}
}
insertImage(imgObjs);
catchRemote && editor.fireEvent("catchRemoteImage");
hideFlash();
}
/**
* 單張圖片
*/
function insertSingle() {
var url = g("url"),
width = g("width"),
height = g("height"),
border = g("border"),
vhSpace = g("vhSpace"),
title = g("title"),
align = findFocus("remoteFloat", "name"),
imgObj = {};
if (!url.value) return;
if (!flagImg) return; //粘貼地址后如果沒(méi)有生成對(duì)應(yīng)的預(yù)覽圖,可以認(rèn)為本次粘貼地址失敗
if (!checkNum([width, height, border, vhSpace])) return false;
imgObj.src = url.value;
imgObj.data_ue_src = url.value;
imgObj.width = width.value;
imgObj.height = height.value;
imgObj.border = border.value;
imgObj.floatStyle = align;
imgObj.vspace = imgObj.hspace = vhSpace.value;
imgObj.title = title.value;
imgObj.style = "width:" + width.value + "px;height:" + height.value + "px;";
insertImage(imgObj);
editor.fireEvent("catchRemoteImage");
hideFlash();
}
/**
* 檢測(cè)傳入的所有input框中輸入的長(zhǎng)寬是否是正數(shù)
* @param nodes input框集合,
*/
function checkNum(nodes) {
for (var i = 0, ci; ci = nodes[i++];) {
if (!isNumber(ci.value) || ci.value < 0) {
alert(lang.numError);
ci.value = "";
ci.focus();
return false;
}
}
return true;
}
/**
* 數(shù)字判斷
* @param value
*/
function isNumber(value) {
return /(0|^[1-9]\d*$)/.test(value);
}
/**
* 多張圖片
*/
function insertBatch() {
if (imageUrls.length < 1) return;
var imgObjs = [],
align = findFocus("localFloat", "name");
for (var i = 0, ci; ci = imageUrls[i++];) {
var tmpObj = {};
tmpObj.title = ci.title;
tmpObj.floatStyle = align;
//修正顯示時(shí)候的地址數(shù)據(jù),如果后臺(tái)返回的是圖片的絕對(duì)地址,那么此處無(wú)需修正
tmpObj.data_ue_src = tmpObj.src = editor.options.imagePath + ci.url;
imgObjs.push(tmpObj);
}
insertImage(imgObjs);
hideFlash();
}
/**
* 找到id下具有focus類的節(jié)點(diǎn)并返回該節(jié)點(diǎn)下的某個(gè)屬性
* @param id
* @param returnProperty
*/
function findFocus(id, returnProperty) {
var tabs = g(id).children,
property;
for (var i = 0, ci; ci = tabs[i++];) {
if (ci.className == "focus") {
property = ci.getAttribute(returnProperty);
break;
}
}
return property;
}
/**
* 綁定地址框改變事件
*/
function addUrlChangeListener() {
var value = g("url").value;
if (browser.ie) {
g("url").onpropertychange = function () {
var v = this.value;
if (v != value) {
createPreviewImage(v);
value = v;
}
};
} else {
g("url").addEventListener("input", function () {
var v = this.value;
if (v != value) {
createPreviewImage(v);
value = v;
}
}, false);
}
}
/**
* 綁定圖片等比縮放事件
* @param percent 縮放比例
*/
function addSizeChangeListener(percent) {
var width = g("width"),
height = g("height"),
lock = g('lock');
width.onkeyup = function () {
if (!isNaN(this.value) && lock.checked) {
height.value = Math.round(this.value / percent) || this.value;
}
};
height.onkeyup = function () {
if (!isNaN(this.value) && lock.checked) {
width.value = Math.round(this.value * percent) || this.value;
}
}
}
/**
* 依據(jù)url中的地址創(chuàng)建一個(gè)預(yù)覽圖片并將對(duì)應(yīng)的信息填入信息框和預(yù)覽框
*/
function createPreviewImage(url) {
if (!url) {
flagImg = null;
g("preview").innerHTML = "";
g("width").value = "";
g("height").value = "";
g("border").value = "";
g("vhSpace").value = "";
g("title").value = "";
$focus(g("url"));
return;
}
var img = document.createElement("img"),
preview = g("preview");
var imgTypeReg = /\.(png|gif|jpg|jpeg)$/gi, //格式過(guò)濾
urlFilter = ""; //地址過(guò)濾
if (!imgTypeReg.test(url) || url.indexOf(urlFilter) == -1) {
preview.innerHTML = "<span style='color: red'>" + lang.imageUrlError + "</span>";
flagImg = null;
return;
}
preview.innerHTML = lang.imageLoading;
img.onload = function () {
flagImg = this;
showImageInfo(this);
showPreviewImage(this,true);
this.onload = null;
};
img.onerror = function () {
preview.innerHTML = "<span style='color: red'>" + lang.imageLoadError + "</span>";
flagImg = null;
this.onerror = null;
};
img.src = url;
}
/**
* 顯示圖片對(duì)象的信息
* @param img
*/
function showImageInfo(img) {
if (!img.getAttribute("src") || !img.src) return;
var wordImgFlag = img.getAttribute("word_img");
g("url").value = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('data_ue_src') || img.getAttribute("src", 2).replace("&", "&"));
g("width").value = img.width || 0;
g("height").value = img.height || 0;
g("border").value = img.getAttribute("border") || 0;
g("vhSpace").value = img.getAttribute("vspace") || 0;
g("title").value = img.title || "";
var align = editor.queryCommandValue("imageFloat") || "none";
updateAlignButton(align);
//保存原始比例,用于等比縮放
var percent = (img.width / img.height).toFixed(2);
addSizeChangeListener(percent);
}
/**
* 將img顯示在預(yù)覽框,
* @param img
* @param needClone 是否需要克隆后顯示
*/
function showPreviewImage(img, needClone) {
var tmpWidth = img.width, tmpHeight = img.height;
var maxWidth = 262,maxHeight = 262,
target = scaling(tmpWidth,tmpHeight,maxWidth,maxHeight);
target.border = img.border||0;
target.src = img.src;
flagImg = true;
if ((target.width + 2 * target.border) > maxWidth) {
target.width = maxWidth - 2 * target.border;
}
if ((target.height + 2 * target.border) > maxWidth) {
target.height = maxWidth - 2 * target.border;
}
var preview = g("preview");
preview.innerHTML = '<img src="' + target.src + '" width="' + target.width + '" height="' + target.height + '" border="' + target.border + 'px solid #000" />';
}
/**
* 圖片縮放
* @param img
* @param max
*/
function scale(img, max, oWidth, oHeight) {
var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
if (ow > max || oh > max) {
if (ow >= oh) {
if (width = ow - max) {
percent = (width / ow).toFixed(2);
img.height = oh - oh * percent;
img.width = max;
}
} else {
if (height = oh - max) {
percent = (height / oh).toFixed(2);
img.width = ow - ow * percent;
img.height = max;
}
}
}
}
function scaling(width,height,maxWidth,maxHeight){
if(width<maxWidth && height<maxHeight) return {width:width,height:height};
var srcRatio = (width/height).toFixed(2),
tarRatio = (maxWidth/maxHeight).toFixed(2),
w,h;
if(srcRatio<tarRatio){
h = maxHeight;
w = h*srcRatio;
}else{
w = maxWidth;
h = w/srcRatio;
}
return {width:w.toFixed(0),height:h.toFixed(0)}
}
/**
* 創(chuàng)建flash實(shí)例
* @param opt
* @param callbacks
*/
function createFlash(opt, callbacks) {
var i18n = utils.extend({}, lang.flashI18n);
//處理圖片資源地址的編碼,補(bǔ)全等問(wèn)題
for (var i in i18n) {
if (!(i in {"lang":1, "uploadingTF":1, "imageTF":1, "textEncoding":1}) && i18n[i]) {
i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]);
}
}
opt = utils.extend(opt, i18n, false);
var option = {
createOptions:{
id:'flash',
url:opt.flashUrl,
width:opt.width,
height:opt.height,
errorMessage:lang.flashError,
wmode:browser.safari ? 'transparent' : 'window',
ver:'10.0.0',
vars:opt,
container:opt.container
}
};
flashContainer = $G(opt.container);
option = utils.extend(option, callbacks, false);
flashObj = new baidu.flash.imageUploader(option);
}
/**
* 依據(jù)傳入的align值更新按鈕信息
* @param align
*/
function updateAlignButton(align) {
var aligns = g("remoteFloat").children;
for (var i = 0, ci; ci = aligns[i++];) {
if (ci.getAttribute("name") == align) {
if (ci.className != "focus") {
ci.className = "focus";
}
} else {
if (ci.className == "focus") {
ci.className = "";
}
}
}
}
/**
* 創(chuàng)建圖片浮動(dòng)選擇按鈕
* @param ids
*/
function createAlignButton(ids) {
for (var i = 0, ci; ci = ids[i++];) {
var floatContainer = g(ci),
nameMaps = {"none":lang.floatDefault, "left":lang.floatLeft, "right":lang.floatRight, "center":lang.floatCenter};
for (var j in nameMaps) {
var div = document.createElement("div");
div.setAttribute("name", j);
if (j == "none") div.className = "focus";
div.style.cssText = "background:url(images/" + j + "_focus.jpg);";
div.setAttribute("title", nameMaps[j]);
floatContainer.appendChild(div);
}
switchSelect(ci);
}
}
function toggleFlash(show) {
if (flashContainer && browser.webkit) {
flashContainer.style.left = show ? "0" : "-10000px";
}
}
/**
* tab點(diǎn)擊處理事件
* @param tabHeads
* @param tabBodys
* @param obj
*/
function clickHandler(tabHeads, tabBodys, obj) {
//head樣式更改
for (var k = 0, len = tabHeads.length; k < len; k++) {
tabHeads[k].className = "";
}
obj.className = "focus";
//body顯隱
var tabSrc = obj.getAttribute("tabSrc");
for (var j = 0, length = tabBodys.length; j < length; j++) {
var body = tabBodys[j],
id = body.getAttribute("id");
body.onclick = function () {
this.style.zoom = 1;
};
if (id != tabSrc) {
body.style.zIndex = 1;
} else {
body.style.zIndex = 200;
//當(dāng)切換到本地圖片上傳時(shí),隱藏遮罩用的iframe
if (id == "local") {
toggleFlash(true);
maskIframe.style.display = "none";
//處理確定按鈕的狀態(tài)
if (selectedImageCount) {
dialog.buttons[0].setDisabled(true);
}
} else {
toggleFlash(false);
maskIframe.style.display = "";
dialog.buttons[0].setDisabled(false);
}
var list = g("imageList");
list.style.display = "none";
//切換到圖片管理時(shí),ajax請(qǐng)求后臺(tái)圖片列表
if (id == "imgManager") {
list.style.display = "";
//已經(jīng)初始化過(guò)時(shí)不再重復(fù)提交請(qǐng)求
if (!list.children.length) {
ajax.request(editor.options.imageManagerUrl, {
timeout:100000,
action:"get",
onsuccess:function (xhr) {
//去除空格
var tmp = utils.trim(xhr.responseText),
imageUrls = !tmp ? [] : tmp.split("ue_separate_ue"),
length = imageUrls.length;
g("imageList").innerHTML = !length ? " " + lang.noUploadImage : "";
for (var k = 0, ci; ci = imageUrls[k++];) {
var img = document.createElement("img");
var div = document.createElement("div");
div.appendChild(img);
div.style.display = "none";
g("imageList").appendChild(div);
img.onclick = function () {
changeSelected(this);
};
//Add Start=============================== 2013-05-12
img.ondblclick = function(){
var me = this,src = me.getAttribute("src",2);
if(!confirm("刪除操作不可恢復(fù),您確認(rèn)要?jiǎng)h除本圖片么?")) return;
ajax.request(editor.options.imageManagerUrl,{
action:"del",
fileName:src.substr(src.lastIndexOf("/")+1),
onsuccess:function(xhr){
if(xhr.responseText=="success") {
me.parentNode.removeChild(me);
}else{
alert("服務(wù)器刪除圖片失敗,請(qǐng)重試!");
}
},
onerror:function(xhr){
}
});
};
//Add End================================ 2013-05-12
img.onload = function () {
this.parentNode.style.display = "";
var w = this.width, h = this.height;
scale(this, 100, 120, 80);
this.title = lang.toggleSelect + w + "X" + h;
this.onload = null;
};
img.setAttribute(k < 35 ? "src" : "lazy_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig, ""));
img.setAttribute("data_ue_src", editor.options.imageManagerPath + ci.replace(/\s+|\s+/ig, ""));
}
},
onerror:function () {
g("imageList").innerHTML = lang.imageLoadError;
}
});
}
}
if (id == "imgSearch") {
selectTxt(g("imgSearchTxt"));
}
if (id == "remote") {
$focus(g("url"));
}
}
}
}
/**
* TAB切換
* @param tabParentId tab的父節(jié)點(diǎn)ID或者對(duì)象本身
*/
function switchTab(tabParentId) {
var tabElements = g(tabParentId).children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for (var i = 0, length = tabHeads.length; i < length; i++) {
var head = tabHeads[i];
if (head.className === "focus")clickHandler(tabHeads, tabBodys, head);
head.onclick = function () {
clickHandler(tabHeads, tabBodys, this);
}
}
}
/**
* 改變o的選中狀態(tài)
* @param o
*/
function changeSelected(o) {
if (o.getAttribute("selected")) {
o.removeAttribute("selected");
o.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
} else {
o.setAttribute("selected", "true");
o.style.cssText = "filter:alpha(Opacity=50);-moz-opacity:0.5;opacity: 0.5;border:2px solid blue;";
}
}
/**
* 選擇切換,傳入一個(gè)container的ID
* @param selectParentId
*/
function switchSelect(selectParentId) {
var select = g(selectParentId),
children = select.children;
domUtils.on(select, "click", function (evt) {
var tar = evt.srcElement || evt.target;
for (var j = 0, cj; cj = children[j++];) {
cj.className = "";
cj.removeAttribute && cj.removeAttribute("class");
}
tar.className = "focus";
});
}
/**
* gb2312編碼
* @param str
*/
function encodeToGb2312(str) {
var strOut = "";
for (var i = 0; i < str.length; i++) {
var c = str.charAt(i),
code = str.charCodeAt(i);
if (c == " ") strOut += "+";
else if (code >= 19968 && code <= 40869) {
var index = code - 19968;
strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2);
} else {
strOut += "%" + str.charCodeAt(i).toString(16);
}
}
return strOut;
}
})();
相關(guān)文章
詳解在ASP.NET Core中使用Angular2以及與Angular2的Token base身份認(rèn)證
這篇文章主要介紹了詳解在ASP.NET Core中使用Angular2以及與Angular2的Token base身份認(rèn)證,有興趣的可以了解一下。2016-12-12
ASP.NET記住登陸用戶名的具體實(shí)現(xiàn)
ASP.NET記住登陸用戶名的具體實(shí)現(xiàn),需要的朋友可以參考一下2013-06-06
WPF使用VisualTreeHelper進(jìn)行命中測(cè)試
這篇文章介紹了WPF使用VisualTreeHelper進(jìn)行命中測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
談?wù)剬?duì).NET中async/await的理解
本文介紹了.NET中異步編程的概念,包括async和await關(guān)鍵字的使用,以及異步編程的性能提升機(jī)制,異步編程通過(guò)非阻塞操作提高了程序執(zhí)行效率,減少了主線程的等待時(shí)間,感興趣的朋友一起看看吧2025-03-03
詳解.NET Core+Docker 開(kāi)發(fā)微服務(wù)
這篇文章給大家分享了.NET Core+Docker 開(kāi)發(fā)微服務(wù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考下。2018-09-09
C# 調(diào)用存儲(chǔ)過(guò)程簡(jiǎn)單完整的實(shí)例代碼
自己copy過(guò)來(lái)的,忘了出處,一來(lái)分享,二來(lái)保存起來(lái),想學(xué)習(xí)c#與存儲(chǔ)過(guò)程結(jié)合使用的朋友可以參考下。2010-01-01
Asp.net MVC 對(duì)所有用戶輸入的字符串字段做Trim處理的方法
這篇文章主要介紹了Asp.net MVC 如何對(duì)所有用戶輸入的字符串字段做Trim處理,需要的朋友可以參考下2017-06-06
ASP.NET session.timeout設(shè)置案例詳解
這篇文章主要介紹了ASP.NET session.timeout設(shè)置案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
在.NET使用JSON作為數(shù)據(jù)交換格式實(shí)例演示
JSON(JavaScript Object Notation)是一種輕量級(jí)輕量級(jí)的數(shù)據(jù)交換格式,并且它獨(dú)立于編程語(yǔ)言,接下來(lái)為大家介紹下使用JSON作為數(shù)據(jù)交換格式在.net中的應(yīng)用2013-03-03
.NET?6開(kāi)發(fā)TodoList應(yīng)用實(shí)現(xiàn)系列背景
這篇文章主要介紹了.NET?6開(kāi)發(fā)TodoList應(yīng)用實(shí)現(xiàn)系列背景,NET?6是一個(gè)很優(yōu)秀的框架,這一點(diǎn)自從我最開(kāi)始接觸.NET?Core?2起一年一年進(jìn)化到現(xiàn)在,就深切地感受到,那好東西就拿出來(lái)和大家分享一下,下面來(lái)看一下文章的學(xué)習(xí)介紹吧2021-12-12

