您使用 a 的想法<canvas>
是可能的。
请参阅演示(在 Chrome、Safari 和 Opera 上测试)。
您可以使用html2canvas将以下内容转换为 3 个不同的画布,并比较它们的 base64 字符串以确定它们在视觉上是否相同。您应该将它们包装在单独的容器中,以便所有文本都呈现在画布中。
<div id="target1-container">
<div id="target1"> Some<sup>en</sup> <i><b>text</b></i> </div>
</div>
<div id="target2-container">
<div id="target2"> Some<sup>en</sup> <span class='boldIt'>text</span></div>
</div>
<div id="target3-container">
<div id="target3"> Someen text</div>
</div>
转换为canvas和base64字符串,使用async.js处理多个异步调用:
async.parallel({
target1: function (callback) {
html2canvas(document.getElementById("target1-container"), {
onrendered: function (canvas) {
callback(null, canvas.toDataURL());
}
});
},
target2: function (callback) {
html2canvas(document.getElementById("target2-container"), {
onrendered: function (canvas) {
callback(null, canvas.toDataURL());
}
});
},
target3: function (callback) {
html2canvas(document.getElementById("target3-container"), {
onrendered: function (canvas) {
callback(null, canvas.toDataURL());
}
});
}
},
function (err, results) {
console.log(results);
});
关于您更新的问题,这是一个比较由字符串定义的元素的视觉外观的函数:
function compare(arr, fn) {
// create test div
var testdiv = document.createElement("div");
testdiv.style.marginTop = '1000px';
document.body.appendChild(testdiv);
async.map(
arr,
function (data, callback) {
var htStr = data.one,
htStr2 = data.two;
// create elements from strings
var el = document.createElement("div"),
el2 = document.createElement("div");
el.innerHTML = htStr;
testdiv.appendChild(el);
el2.innerHTML = htStr2;
testdiv.appendChild(el2);
// convert to canvas and base64 strings
async.parallel([
function (callback) {
html2canvas(el, {
onrendered: function (canvas) {
callback(null, canvas.toDataURL());
}
});
},
function (callback) {
html2canvas(el2, {
onrendered: function (canvas) {
callback(null, canvas.toDataURL());
}
});
}
],
// start comparison
function (err, results) {
if (results[0] === results[1]) {
callback(null, true);
} else {
callback(null, false);
}
});
},
// callback function
function (err, results) {
document.body.removeChild(testdiv);
if (typeof fn === 'function') {
fn(results);
}
}
);
}
// elements to be tested
var arr = [];
arr.push({
one: '<div id="target1"> Some<sup>en</sup> <i><b>text</b></i> </div>',
two: '<div id="target2"> Some<sup>en</sup> <span class="boldIt">text</span></div>'
});
arr.push({
one: '<div id="target1"> Some<sup>en</sup> <i><b>text</b></i> </div>',
two: '<div id="target3"> Someen text</div>'
});
// let the test begin
compare(arr, function (result) {
console.log(result);
});
它在回调函数中返回一个数组,其中
true
意味着元素在视觉上是相同的,并且
false
意味着他们是不同的。
请参阅此 DEMO中的控制台。