最近我越来越多地看到一种技术(例如 CNNSI.com)是对所选文本的 AJAX 记录。这是有道理的——如果你检测到用户一遍又一遍地选择这些术语,你可能会假设你的访问者正在谷歌、雅虎等网站上搜索该术语。我已经使用我最喜欢的 JavaScript 库、MooTools 和另一个库复制了这个功能JavaScript 库,jQuery。
MooTools JavaScript
window.addEvent('domready',function(){
//gets the selected text
var getSelection = function() {
return $try(
function() { return window.getSelection(); },
function() { return document.getSelection(); },
function() {
var selection = document.selection && document.selection.createRange();
if(selection.text) { return selection.text; }
return false;
}
) || false;
};
//event to listen
var selectRequest = new Request({
url: 'ajax-selection-copy.php',
method: 'post'
});
$('content-area').addEvent('mouseup',function(e) {
var selection = getSelection();
if(selection && (selection = new String(selection).replace(/^\s+|\s+$/g,''))) {
selectRequest.send('selection=' + encodeURI(selection));
}
});
});
第一步是尝试在我们指定的容器内的 mouseup 期间抓取选定的文本。如果我们找到文本选择,我们会向 PHP 脚本发出 AJAX 请求,该脚本将保存文本选择。
jQuery JavaScript
/* attempt to find a text selection */
function getSelected() {
if(window.getSelection) { return window.getSelection(); }
else if(document.getSelection) { return document.getSelection(); }
else {
var selection = document.selection && document.selection.createRange();
if(selection.text) { return selection.text; }
return false;
}
return false;
}
/* create sniffer */
$(document).ready(function() {
$('#content-area').mouseup(function() {
var selection = getSelected();
if(selection && (selection = new String(selection).replace(/^\s+|\s+$/g,''))) {
$.ajax({
type: 'post',
url: 'ajax-selection-copy.php',
data: 'selection=' + encodeURI(selection)
});
}
});
});
翻译成 jQuery 的 MooTools 代码。
PHP
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' && $selection = trim($_POST['selection'])) {
mysql_query('INSERT INTO text_selections (selection,date_selected) VALUES(\''.mysql_escape_string(stripslashes($selection)).'\',NOW())');
}
上面的PHP代码非常原始。根据您的系统设置(PHP 框架、安全设置等),您将需要实施额外的措施来防止对该脚本的攻击。
记录文本选择是发现您的受众感兴趣的主题和/或术语的好方法。您可能还想在帖子中提供有关这些术语的更多信息。
您对此有何看法?你认为这太像 Spyjax 了吗?完全可以吗?
