This commit is contained in:
45
IQapTcha/static/QapTcha.jquery.css
Normal file
45
IQapTcha/static/QapTcha.jquery.css
Normal file
@@ -0,0 +1,45 @@
|
||||
/*****************/
|
||||
/** QapTcha CSS **/
|
||||
/*****************/
|
||||
#QapTcha {
|
||||
margin-top:10px;
|
||||
}
|
||||
#QapTcha .clr{ clear:both}
|
||||
|
||||
#QapTcha #bgSlider {
|
||||
width:202px;
|
||||
height:22px;
|
||||
background:transparent url('sprites.png') no-repeat 0 -22px;
|
||||
float:left
|
||||
}
|
||||
|
||||
#QapTcha #Slider {
|
||||
width:48px;
|
||||
height:22px;
|
||||
background:transparent url('sprites.png') no-repeat -32px 0;
|
||||
cursor:e-resize
|
||||
}
|
||||
|
||||
#QapTcha #Icons {
|
||||
float:left;
|
||||
width:16px;
|
||||
height:16px;
|
||||
background:transparent url('sprites.png') no-repeat 0 0;
|
||||
margin-top:3px;
|
||||
margin-left:10px;
|
||||
}
|
||||
|
||||
#QapTcha #TxtStatus {
|
||||
float:left;
|
||||
width:202px;
|
||||
margin:4px 0 0 5px;
|
||||
font-size:12px;
|
||||
}
|
||||
|
||||
/** States **/
|
||||
#QapTcha .dropSuccess {
|
||||
color:#67A611
|
||||
}
|
||||
#QapTcha .dropError {
|
||||
color:#bb2828
|
||||
}
|
||||
96
IQapTcha/static/QapTcha.jquery.js
Normal file
96
IQapTcha/static/QapTcha.jquery.js
Normal file
@@ -0,0 +1,96 @@
|
||||
/************************************************************************
|
||||
*************************************************************************
|
||||
@Name : QapTcha - jQuery Plugin
|
||||
@Revison : 2.5
|
||||
@Date : 26/01/2011
|
||||
@Author: Surrel Mickael (www.myjqueryplugins.com - www.msconcept.fr)
|
||||
@License : Open Source - MIT License : http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
**************************************************************************
|
||||
*************************************************************************/
|
||||
jQuery.QapTcha = {
|
||||
build : function(options)
|
||||
{
|
||||
var defaults = {
|
||||
txtLock : '发表评论前,请滑动滚动条解锁',
|
||||
txtUnlock : '已解锁,可以发表评论了',
|
||||
disabledSubmit : false,
|
||||
autoRevert : true,
|
||||
autoSubmit : false,
|
||||
url : '/iQapTcha4tyepcho',
|
||||
action : 'iQapTcha4tyepcho'
|
||||
};
|
||||
|
||||
if(this.length>0)
|
||||
return jQuery(this).each(function(i) {
|
||||
/** Vars **/
|
||||
var
|
||||
opts = $.extend(defaults, options),
|
||||
$this = $(this),
|
||||
form = $('form').has($this),
|
||||
Clr = jQuery('<div>',{'class':'clr'}),
|
||||
bgSlider = jQuery('<div>',{id:'bgSlider'}),
|
||||
Slider = jQuery('<div>',{id:'Slider'}),
|
||||
Icons = jQuery('<div>',{id:'Icons'}),
|
||||
TxtStatus = jQuery('<div>',{id:'TxtStatus','class':'dropError',text:opts.txtLock}),
|
||||
inputQapTcha = jQuery('<input>',{name:'iQapTcha',value:'',type:'hidden'});
|
||||
|
||||
/** Disabled submit button **/
|
||||
if(opts.disabledSubmit) form.find('input[type=\'submit\']').attr('disabled','disabled');
|
||||
|
||||
/** Construct DOM **/
|
||||
bgSlider.appendTo($this);
|
||||
Icons.insertAfter(bgSlider);
|
||||
TxtStatus.insertAfter(Icons);
|
||||
Clr.insertAfter(TxtStatus);
|
||||
|
||||
|
||||
inputQapTcha.appendTo($this);
|
||||
Slider.appendTo(bgSlider);
|
||||
$this.show();
|
||||
|
||||
Slider.draggable({
|
||||
revert: function(){
|
||||
if(opts.autoRevert)
|
||||
{
|
||||
if(parseInt(Slider.css("left")) > 150) return false;
|
||||
else return true;
|
||||
}
|
||||
},
|
||||
containment: bgSlider,
|
||||
axis:'x',
|
||||
stop: function(event,ui){
|
||||
if(ui.position.left > 150)
|
||||
{
|
||||
inputQapTcha.val(generatePass(32));
|
||||
$.post(opts.url,{
|
||||
action : opts.action,
|
||||
iQaptcha : inputQapTcha.val()
|
||||
},
|
||||
function(data) {
|
||||
if(data.code)
|
||||
{
|
||||
Slider.draggable('disable').css('cursor', 'default');
|
||||
TxtStatus.text(opts.txtUnlock).addClass('dropSuccess').removeClass('dropError');
|
||||
Icons.css('background-position', '-16px 0');
|
||||
form.find('input[type=\'submit\']').removeAttr('disabled');
|
||||
if(opts.autoSubmit) form.find('input[type=\'submit\']').trigger('click');
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function generatePass(nb) {
|
||||
var chars = 'azertyupqsdfghjkmwxcvbn23456789AZERTYUPQSDFGHJKMWXCVBN_-#@';
|
||||
var pass = '';
|
||||
for(i=0;i<nb;i++){
|
||||
var wpos = Math.round(Math.random()*chars.length);
|
||||
pass += chars.substring(wpos,wpos+1);
|
||||
}
|
||||
return pass;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}; jQuery.fn.QapTcha = jQuery.QapTcha.build;
|
||||
25
IQapTcha/static/jquery-ui.js
vendored
Normal file
25
IQapTcha/static/jquery-ui.js
vendored
Normal file
File diff suppressed because one or more lines are too long
222
IQapTcha/static/jquery.ui.touch.js
vendored
Normal file
222
IQapTcha/static/jquery.ui.touch.js
vendored
Normal file
@@ -0,0 +1,222 @@
|
||||
/**
|
||||
* jQuery.UI.iPad plugin
|
||||
* Copyright (c) 2010 Stephen von Takach
|
||||
* licensed under MIT.
|
||||
* Date: 27/8/2010
|
||||
*
|
||||
* Project Home:
|
||||
* http://code.google.com/p/jquery-ui-for-ipad-and-iphone/
|
||||
*/
|
||||
|
||||
$(function() {
|
||||
//
|
||||
// Extend jQuery feature detection
|
||||
//
|
||||
$.extend($.support, {
|
||||
touch: "ontouchend" in document
|
||||
});
|
||||
|
||||
//
|
||||
// Hook up touch events
|
||||
//
|
||||
if ($.support.touch) {
|
||||
var obj = document.getElementsByClassName('QapTcha');
|
||||
for(i=0; i<obj.length;i++){
|
||||
obj[i].addEventListener("touchstart", iPadTouchHandler, false);
|
||||
obj[i].addEventListener("touchmove", iPadTouchHandler, false);
|
||||
obj[i].addEventListener("touchend", iPadTouchHandler, false);
|
||||
obj[i].addEventListener("touchcancel", iPadTouchHandler, false);
|
||||
}}
|
||||
});
|
||||
|
||||
|
||||
var lastTap = null; // Holds last tapped element (so we can compare for double tap)
|
||||
var tapValid = false; // Are we still in the .6 second window where a double tap can occur
|
||||
var tapTimeout = null; // The timeout reference
|
||||
|
||||
function cancelTap() {
|
||||
tapValid = false;
|
||||
}
|
||||
|
||||
|
||||
var rightClickPending = false; // Is a right click still feasible
|
||||
var rightClickEvent = null; // the original event
|
||||
var holdTimeout = null; // timeout reference
|
||||
var cancelMouseUp = false; // prevents a click from occuring as we want the context menu
|
||||
|
||||
|
||||
function cancelHold() {
|
||||
if (rightClickPending) {
|
||||
window.clearTimeout(holdTimeout);
|
||||
rightClickPending = false;
|
||||
rightClickEvent = null;
|
||||
}
|
||||
}
|
||||
|
||||
function startHold(event) {
|
||||
if (rightClickPending)
|
||||
return;
|
||||
|
||||
rightClickPending = true; // We could be performing a right click
|
||||
rightClickEvent = (event.changedTouches)[0];
|
||||
holdTimeout = window.setTimeout("doRightClick();", 800);
|
||||
}
|
||||
|
||||
|
||||
function doRightClick() {
|
||||
rightClickPending = false;
|
||||
|
||||
//
|
||||
// We need to mouse up (as we were down)
|
||||
//
|
||||
var first = rightClickEvent,
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
simulatedEvent.initMouseEvent("mouseup", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, 0, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
//
|
||||
// emulate a right click
|
||||
//
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
simulatedEvent.initMouseEvent("mousedown", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, 2, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
//
|
||||
// Show a context menu
|
||||
//
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
simulatedEvent.initMouseEvent("contextmenu", true, true, window, 1, first.screenX + 50, first.screenY + 5, first.clientX + 50, first.clientY + 5,
|
||||
false, false, false, false, 2, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
|
||||
//
|
||||
// Note:: I don't mouse up the right click here however feel free to add if required
|
||||
//
|
||||
|
||||
|
||||
cancelMouseUp = true;
|
||||
rightClickEvent = null; // Release memory
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// mouse over event then mouse down
|
||||
//
|
||||
function iPadTouchStart(event) {
|
||||
var touches = event.changedTouches,
|
||||
first = touches[0],
|
||||
type = "mouseover",
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
//
|
||||
// Mouse over first - I have live events attached on mouse over
|
||||
//
|
||||
simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, 0, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
type = "mousedown";
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
|
||||
simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, 0, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
|
||||
if (!tapValid) {
|
||||
lastTap = first.target;
|
||||
tapValid = true;
|
||||
tapTimeout = window.setTimeout("cancelTap();", 600);
|
||||
startHold(event);
|
||||
}
|
||||
else {
|
||||
window.clearTimeout(tapTimeout);
|
||||
|
||||
//
|
||||
// If a double tap is still a possibility and the elements are the same
|
||||
// Then perform a double click
|
||||
//
|
||||
if (first.target == lastTap) {
|
||||
lastTap = null;
|
||||
tapValid = false;
|
||||
|
||||
type = "click";
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
|
||||
simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, 0/*left*/, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
type = "dblclick";
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
|
||||
simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, 0/*left*/, null);
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
}
|
||||
else {
|
||||
lastTap = first.target;
|
||||
tapValid = true;
|
||||
tapTimeout = window.setTimeout("cancelTap();", 600);
|
||||
startHold(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function iPadTouchHandler(event) {
|
||||
var type = "",
|
||||
button = 0; /*left*/
|
||||
|
||||
if (event.touches.length > 1)
|
||||
return;
|
||||
|
||||
switch (event.type) {
|
||||
case "touchstart":
|
||||
if ($(event.changedTouches[0].target).is("select")) {
|
||||
return;
|
||||
}
|
||||
iPadTouchStart(event); /*We need to trigger two events here to support one touch drag and drop*/
|
||||
event.preventDefault();
|
||||
return false;
|
||||
break;
|
||||
|
||||
case "touchmove":
|
||||
cancelHold();
|
||||
type = "mousemove";
|
||||
event.preventDefault();
|
||||
break;
|
||||
|
||||
case "touchend":
|
||||
if (cancelMouseUp) {
|
||||
cancelMouseUp = false;
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
cancelHold();
|
||||
type = "mouseup";
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
var touches = event.changedTouches,
|
||||
first = touches[0],
|
||||
simulatedEvent = document.createEvent("MouseEvent");
|
||||
|
||||
simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, button, null);
|
||||
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
|
||||
if (type == "mouseup" && tapValid && first.target == lastTap) { // This actually emulates the ipads default behaviour (which we prevented)
|
||||
simulatedEvent = document.createEvent("MouseEvent"); // This check avoids click being emulated on a double tap
|
||||
|
||||
simulatedEvent.initMouseEvent("click", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
|
||||
false, false, false, false, button, null);
|
||||
|
||||
first.target.dispatchEvent(simulatedEvent);
|
||||
}
|
||||
}
|
||||
BIN
IQapTcha/static/sprites.png
Normal file
BIN
IQapTcha/static/sprites.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Reference in New Issue
Block a user