国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

Bootstrap3使用typeahead插件實現(xiàn)自動補(bǔ)全功能

 更新時間:2016年07月07日 11:04:36   作者:季楓  
這篇文章主要介紹了Bootstrap3使用typeahead插件實現(xiàn)自動補(bǔ)全功能的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

很酷的一個自動補(bǔ)全插件

http://twitter.github.io/typeahead.js

在bootstrap中使用typeahead插件,完成自動補(bǔ)全

相關(guān)的文檔:https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md

數(shù)據(jù)源:

Local:數(shù)組

prefectch:json

remote等方式

--------------------------------------------------------------------------------

html:

<input id="orderNo" class="typeahead" placeholder="Countries" type="text" class="form-control" name="ordersn"> 

js:

var states = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace,
queryTokenizer: Bloodhound.tokenizers.whitespace,
// `states` is an array of state names defined in "The Basics"
local: states
});
var findOrderByIdVague = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: '${ctx}/admin/order/preOrderByIdVague.json',
remote: {
url: '${ctx}/admin/order/findOrderByIdVague/%QUERY.json',
wildcard: '%QUERY'
},
afterSelect: function (item) {
//選擇項之后的事件 ,item是當(dāng)前選中的。
alert(iterm);
}
});
$(function(){
/**
$('#addCombo .typeahead').typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
name: 'states',
source: states
});
**/
$('#addCombo .typeahead').typeahead(null, {
name: 'best-pictures',
display: 'value',
source: findOrderByIdVague
});
$('#addCombo .typeahead').bind('typeahead:select', function(ev, suggestion) {
console.log('Selection: ' + suggestion.value);
});
}); 
  …findOrderByIdVague/D20150502.json:
[ {
"value" : "D20150502173435141299"
}, {
"value" : "D20150502172928109304"
} ] 

preOrderByIdVague.json:

[{"value":"D201"}] 

docs 相關(guān)的事件: 

Custom Events
The following events get triggered on the input element during the life-cycle of a typeahead.
typeahead:active – Fired when the typeahead moves to active state.
typeahead:idle – Fired when the typeahead moves to idle state.
typeahead:open – Fired when the results container is opened.
typeahead:close – Fired when the results container is closed.
typeahead:change – Normalized version of the native change event. Fired when input loses focus and the value has changed since it originally received focus.
typeahead:render – Fired when suggestions are rendered for a dataset. The event handler will be invoked with 4 arguments: the jQuery event object, the suggestions that were rendered, a flag indicating whether the suggestions were fetched asynchronously, and the name of the dataset the rendering occurred in.
typeahead:select – Fired when a suggestion is selected. The event handler will be invoked with 2 arguments: the jQuery event object and the suggestion object that was selected.
typeahead:autocomplete – Fired when a autocompletion occurs. The event handler will be invoked with 2 arguments: the jQuery event object and the suggestion object that was used for autocompletion.
typeahead:cursorchange – Fired when the results container cursor moves. The event handler will be invoked with 2 arguments: the jQuery event object and the suggestion object that was moved to.
typeahead:asyncrequest – Fired when an async request for suggestions is sent. The event handler will be invoked with 3 arguments: the jQuery event object, the current query, and the name of the dataset the async request belongs to.
typeahead:asynccancel – Fired when an async request is cancelled. The event handler will be invoked with 3 arguments: the jQuery event object, the current query, and the name of the dataset the async request belonged to.
typeahead:asyncreceive – Fired when an async request completes. The event handler will be invoked with 3 arguments: the jQuery event object, the current query, and the name of the dataset the async request belongs to.
Example usage:
$('.typeahead').bind('typeahead:select', function(ev, suggestion) {
console.log('Selection: ' + suggestion);
}); 

typeahead.bundle.js:

/*!
* typeahead.js 0.11.1
* https://github.com/twitter/typeahead.js
* Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
*/
(function(root, factory) {
if (typeof define === "function" && define.amd) {
define("bloodhound", [ "jquery" ], function(a0) {
return root["Bloodhound"] = factory(a0);
});
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"));
} else {
root["Bloodhound"] = factory(jQuery);
}
})(this, function($) {
var _ = function() {
"use strict";
return {
isMsie: function() {
return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
},
isBlankString: function(str) {
return !str || /^\s*$/.test(str);
},
escapeRegExChars: function(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
},
isString: function(obj) {
return typeof obj === "string";
},
isNumber: function(obj) {
return typeof obj === "number";
},
isArray: $.isArray,
isFunction: $.isFunction,
isObject: $.isPlainObject,
isUndefined: function(obj) {
return typeof obj === "undefined";
},
isElement: function(obj) {
return !!(obj && obj.nodeType === 1);
},
isJQuery: function(obj) {
return obj instanceof $;
},
toStr: function toStr(s) {
return _.isUndefined(s) || s === null ? "" : s + "";
},
bind: $.proxy,
each: function(collection, cb) {
$.each(collection, reverseArgs);
function reverseArgs(index, value) {
return cb(value, index);
}
},
map: $.map,
filter: $.grep,
every: function(obj, test) {
var result = true;
if (!obj) {
return result;
}
$.each(obj, function(key, val) {
if (!(result = test.call(null, val, key, obj))) {
return false;
}
});
return !!result;
},
some: function(obj, test) {
var result = false;
if (!obj) {
return result;
}
$.each(obj, function(key, val) {
if (result = test.call(null, val, key, obj)) {
return false;
}
});
return !!result;
},
mixin: $.extend,
identity: function(x) {
return x;
},
clone: function(obj) {
return $.extend(true, {}, obj);
},
getIdGenerator: function() {
var counter = 0;
return function() {
return counter++;
};
},
templatify: function templatify(obj) {
return $.isFunction(obj) ? obj : template;
function template() {
return String(obj);
}
},
defer: function(fn) {
setTimeout(fn, 0);
},
debounce: function(func, wait, immediate) {
var timeout, result;
return function() {
var context = this, args = arguments, later, callNow;
later = function() {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
}
};
callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
}
return result;
};
},
throttle: function(func, wait) {
var context, args, timeout, result, previous, later;
previous = 0;
later = function() {
previous = new Date();
timeout = null;
result = func.apply(context, args);
};
return function() {
var now = new Date(), remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
} else if (!timeout) {
timeout = setTimeout(later, remaining);
}
return result;
};
},
stringify: function(val) {
return _.isString(val) ? val : JSON.stringify(val);
},
noop: function() {}
};
}();
var VERSION = "0.11.1";
var tokenizers = function() {
"use strict";
return {
nonword: nonword,
whitespace: whitespace,
obj: {
nonword: getObjTokenizer(nonword),
whitespace: getObjTokenizer(whitespace)
}
};
function whitespace(str) {
str = _.toStr(str);
return str ? str.split(/\s+/) : [];
}
function nonword(str) {
str = _.toStr(str);
return str ? str.split(/\W+/) : [];
}
function getObjTokenizer(tokenizer) {
return function setKey(keys) {
keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);
return function tokenize(o) {
var tokens = [];
_.each(keys, function(k) {
tokens = tokens.concat(tokenizer(_.toStr(o[k])));
});
return tokens;
};
};
}
}();
var LruCache = function() {
"use strict";
function LruCache(maxSize) {
this.maxSize = _.isNumber(maxSize) ? maxSize : 100;
this.reset();
if (this.maxSize <= 0) {
this.set = this.get = $.noop;
}
}
_.mixin(LruCache.prototype, {
set: function set(key, val) {
var tailItem = this.list.tail, node;
if (this.size >= this.maxSize) {
this.list.remove(tailItem);
delete this.hash[tailItem.key];
this.size--;
}
if (node = this.hash[key]) {
node.val = val;
this.list.moveToFront(node);
} else {
node = new Node(key, val);
this.list.add(node);
this.hash[key] = node;
this.size++;
}
},
get: function get(key) {
var node = this.hash[key];
if (node) {
this.list.moveToFront(node);
return node.val;
}
},
reset: function reset() {
this.size = 0;
this.hash = {};
this.list = new List();
}
});
function List() {
this.head = this.tail = null;
}
_.mixin(List.prototype, {
add: function add(node) {
if (this.head) {
node.next = this.head;
this.head.prev = node;
}
this.head = node;
this.tail = this.tail || node;
},
remove: function remove(node) {
node.prev ? node.prev.next = node.next : this.head = node.next;
node.next ? node.next.prev = node.prev : this.tail = node.prev;
},
moveToFront: function(node) {
this.remove(node);
this.add(node);
}
});
function Node(key, val) {
this.key = key;
this.val = val;
this.prev = this.next = null;
}
return LruCache;
}();
var PersistentStorage = function() {
"use strict";
var LOCAL_STORAGE;
try {
LOCAL_STORAGE = window.localStorage;
LOCAL_STORAGE.setItem("~~~", "!");
LOCAL_STORAGE.removeItem("~~~");
} catch (err) {
LOCAL_STORAGE = null;
}
function PersistentStorage(namespace, override) {
this.prefix = [ "__", namespace, "__" ].join("");
this.ttlKey = "__ttl__";
this.keyMatcher = new RegExp("^" + _.escapeRegExChars(this.prefix));
this.ls = override || LOCAL_STORAGE;
!this.ls && this._noop();
}
_.mixin(PersistentStorage.prototype, {
_prefix: function(key) {
return this.prefix + key;
},
_ttlKey: function(key) {
return this._prefix(key) + this.ttlKey;
},
_noop: function() {
this.get = this.set = this.remove = this.clear = this.isExpired = _.noop;
},
_safeSet: function(key, val) {
try {
this.ls.setItem(key, val);
} catch (err) {
if (err.name === "QuotaExceededError") {
this.clear();
this._noop();
}
}
},
get: function(key) {
if (this.isExpired(key)) {
this.remove(key);
}
return decode(this.ls.getItem(this._prefix(key)));
},
set: function(key, val, ttl) {
if (_.isNumber(ttl)) {
this._safeSet(this._ttlKey(key), encode(now() + ttl));
} else {
this.ls.removeItem(this._ttlKey(key));
}
return this._safeSet(this._prefix(key), encode(val));
},
remove: function(key) {
this.ls.removeItem(this._ttlKey(key));
this.ls.removeItem(this._prefix(key));
return this;
},
clear: function() {
var i, keys = gatherMatchingKeys(this.keyMatcher);
for (i = keys.length; i--; ) {
this.remove(keys[i]);
}
return this;
},
isExpired: function(key) {
var ttl = decode(this.ls.getItem(this._ttlKey(key)));
return _.isNumber(ttl) && now() > ttl ? true : false;
}
});
return PersistentStorage;
function now() {
return new Date().getTime();
}
function encode(val) {
return JSON.stringify(_.isUndefined(val) ? null : val);
}
function decode(val) {
return $.parseJSON(val);
}
function gatherMatchingKeys(keyMatcher) {
var i, key, keys = [], len = LOCAL_STORAGE.length;
for (i = 0; i < len; i++) {
if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {
keys.push(key.replace(keyMatcher, ""));
}
}
return keys;
}
}();
var Transport = function() {
"use strict";
var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10);
function Transport(o) {
o = o || {};
this.cancelled = false;
this.lastReq = null;
this._send = o.transport;
this._get = o.limiter ? o.limiter(this._get) : this._get;
this._cache = o.cache === false ? new LruCache(0) : sharedCache;
}
Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {
maxPendingRequests = num;
};
Transport.resetCache = function resetCache() {
sharedCache.reset();
};
_.mixin(Transport.prototype, {
_fingerprint: function fingerprint(o) {
o = o || {};
return o.url + o.type + $.param(o.data || {});
},
_get: function(o, cb) {
var that = this, fingerprint, jqXhr;
fingerprint = this._fingerprint(o);
if (this.cancelled || fingerprint !== this.lastReq) {
return;
}
if (jqXhr = pendingRequests[fingerprint]) {
jqXhr.done(done).fail(fail);
} else if (pendingRequestsCount < maxPendingRequests) {
pendingRequestsCount++;
pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always);
} else {
this.onDeckRequestArgs = [].slice.call(arguments, 0);
}
function done(resp) {
cb(null, resp);
that._cache.set(fingerprint, resp);
}
function fail() {
cb(true);
}
function always() {
pendingRequestsCount--;
delete pendingRequests[fingerprint];
if (that.onDeckRequestArgs) {
that._get.apply(that, that.onDeckRequestArgs);
that.onDeckRequestArgs = null;
}
}
},
get: function(o, cb) {
var resp, fingerprint;
cb = cb || $.noop;
o = _.isString(o) ? {
url: o
} : o || {};
fingerprint = this._fingerprint(o);
this.cancelled = false;
this.lastReq = fingerprint;
if (resp = this._cache.get(fingerprint)) {
cb(null, resp);
} else {
this._get(o, cb);
}
},
cancel: function() {
this.cancelled = true;
}
});
return Transport;
}();
var SearchIndex = window.SearchIndex = function() {
"use strict";
var CHILDREN = "c", IDS = "i";
function SearchIndex(o) {
o = o || {};
if (!o.datumTokenizer || !o.queryTokenizer) {
$.error("datumTokenizer and queryTokenizer are both required");
}
this.identify = o.identify || _.stringify;
this.datumTokenizer = o.datumTokenizer;
this.queryTokenizer = o.queryTokenizer;
this.reset();
}
_.mixin(SearchIndex.prototype, {
bootstrap: function bootstrap(o) {
this.datums = o.datums;
this.trie = o.trie;
},
add: function(data) {
var that = this;
data = _.isArray(data) ? data : [ data ];
_.each(data, function(datum) {
var id, tokens;
that.datums[id = that.identify(datum)] = datum;
tokens = normalizeTokens(that.datumTokenizer(datum));
_.each(tokens, function(token) {
var node, chars, ch;
node = that.trie;
chars = token.split("");
while (ch = chars.shift()) {
node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode());
node[IDS].push(id);
}
});
});
},
get: function get(ids) {
var that = this;
return _.map(ids, function(id) {
return that.datums[id];
});
},
search: function search(query) {
var that = this, tokens, matches;
tokens = normalizeTokens(this.queryTokenizer(query));
_.each(tokens, function(token) {
var node, chars, ch, ids;
if (matches && matches.length === 0) {
return false;
}
node = that.trie;
chars = token.split("");
while (node && (ch = chars.shift())) {
node = node[CHILDREN][ch];
}
if (node && chars.length === 0) {
ids = node[IDS].slice(0);
matches = matches ? getIntersection(matches, ids) : ids;
} else {
matches = [];
return false;
}
});
return matches ? _.map(unique(matches), function(id) {
return that.datums[id];
}) : [];
},
all: function all() {
var values = [];
for (var key in this.datums) {
values.push(this.datums[key]);
}
return values;
},
reset: function reset() {
this.datums = {};
this.trie = newNode();
},
serialize: function serialize() {
return {
datums: this.datums,
trie: this.trie
};
}
});
return SearchIndex;
function normalizeTokens(tokens) {
tokens = _.filter(tokens, function(token) {
return !!token;
});
tokens = _.map(tokens, function(token) {
return token.toLowerCase();
});
return tokens;
}
function newNode() {
var node = {};
node[IDS] = [];
node[CHILDREN] = {};
return node;
}
function unique(array) {
var seen = {}, uniques = [];
for (var i = 0, len = array.length; i < len; i++) {
if (!seen[array[i]]) {
seen[array[i]] = true;
uniques.push(array[i]);
}
}
return uniques;
}
function getIntersection(arrayA, arrayB) {
var ai = 0, bi = 0, intersection = [];
arrayA = arrayA.sort();
arrayB = arrayB.sort();
var lenArrayA = arrayA.length, lenArrayB = arrayB.length;
while (ai < lenArrayA && bi < lenArrayB) {
if (arrayA[ai] < arrayB[bi]) {
ai++;
} else if (arrayA[ai] > arrayB[bi]) {
bi++;
} else {
intersection.push(arrayA[ai]);
ai++;
bi++;
}
}
return intersection;
}
}();
var Prefetch = function() {
"use strict";
var keys;
keys = {
data: "data",
protocol: "protocol",
thumbprint: "thumbprint"
};
function Prefetch(o) {
this.url = o.url;
this.ttl = o.ttl;
this.cache = o.cache;
this.prepare = o.prepare;
this.transform = o.transform;
this.transport = o.transport;
this.thumbprint = o.thumbprint;
this.storage = new PersistentStorage(o.cacheKey);
}
_.mixin(Prefetch.prototype, {
_settings: function settings() {
return {
url: this.url,
type: "GET",
dataType: "json"
};
},
store: function store(data) {
if (!this.cache) {
return;
}
this.storage.set(keys.data, data, this.ttl);
this.storage.set(keys.protocol, location.protocol, this.ttl);
this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);
},
fromCache: function fromCache() {
var stored = {}, isExpired;
if (!this.cache) {
return null;
}
stored.data = this.storage.get(keys.data);
stored.protocol = this.storage.get(keys.protocol);
stored.thumbprint = this.storage.get(keys.thumbprint);
isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol;
return stored.data && !isExpired ? stored.data : null;
},
fromNetwork: function(cb) {
var that = this, settings;
if (!cb) {
return;
}
settings = this.prepare(this._settings());
this.transport(settings).fail(onError).done(onResponse);
function onError() {
cb(true);
}
function onResponse(resp) {
cb(null, that.transform(resp));
}
},
clear: function clear() {
this.storage.clear();
return this;
}
});
return Prefetch;
}();
var Remote = function() {
"use strict";
function Remote(o) {
this.url = o.url;
this.prepare = o.prepare;
this.transform = o.transform;
this.transport = new Transport({
cache: o.cache,
limiter: o.limiter,
transport: o.transport
});
}
_.mixin(Remote.prototype, {
_settings: function settings() {
return {
url: this.url,
type: "GET",
dataType: "json"
};
},
get: function get(query, cb) {
var that = this, settings;
if (!cb) {
return;
}
query = query || "";
settings = this.prepare(query, this._settings());
return this.transport.get(settings, onResponse);
function onResponse(err, resp) {
err ? cb([]) : cb(that.transform(resp));
}
},
cancelLastRequest: function cancelLastRequest() {
this.transport.cancel();
}
});
return Remote;
}();
var oParser = function() {
"use strict";
return function parse(o) {
var defaults, sorter;
defaults = {
initialize: true,
identify: _.stringify,
datumTokenizer: null,
queryTokenizer: null,
sufficient: 5,
sorter: null,
local: [],
prefetch: null,
remote: null
};
o = _.mixin(defaults, o || {});
!o.datumTokenizer && $.error("datumTokenizer is required");
!o.queryTokenizer && $.error("queryTokenizer is required");
sorter = o.sorter;
o.sorter = sorter ? function(x) {
return x.sort(sorter);
} : _.identity;
o.local = _.isFunction(o.local) ? o.local() : o.local;
o.prefetch = parsePrefetch(o.prefetch);
o.remote = parseRemote(o.remote);
return o;
};
function parsePrefetch(o) {
var defaults;
if (!o) {
return null;
}
defaults = {
url: null,
ttl: 24 * 60 * 60 * 1e3,
cache: true,
cacheKey: null,
thumbprint: "",
prepare: _.identity,
transform: _.identity,
transport: null
};
o = _.isString(o) ? {
url: o
} : o;
o = _.mixin(defaults, o);
!o.url && $.error("prefetch requires url to be set");
o.transform = o.filter || o.transform;
o.cacheKey = o.cacheKey || o.url;
o.thumbprint = VERSION + o.thumbprint;
o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
return o;
}
function parseRemote(o) {
var defaults;
if (!o) {
return;
}
defaults = {
url: null,
cache: true,
prepare: null,
replace: null,
wildcard: null,
limiter: null,
rateLimitBy: "debounce",
rateLimitWait: 300,
transform: _.identity,
transport: null
};
o = _.isString(o) ? {
url: o
} : o;
o = _.mixin(defaults, o);
!o.url && $.error("remote requires url to be set");
o.transform = o.filter || o.transform;
o.prepare = toRemotePrepare(o);
o.limiter = toLimiter(o);
o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
delete o.replace;
delete o.wildcard;
delete o.rateLimitBy;
delete o.rateLimitWait;
return o;
}
function toRemotePrepare(o) {
var prepare, replace, wildcard;
prepare = o.prepare;
replace = o.replace;
wildcard = o.wildcard;
if (prepare) {
return prepare;
}
if (replace) {
prepare = prepareByReplace;
} else if (o.wildcard) {
prepare = prepareByWildcard;
} else {
prepare = idenityPrepare;
}
return prepare;
function prepareByReplace(query, settings) {
settings.url = replace(settings.url, query);
return settings;
}
function prepareByWildcard(query, settings) {
settings.url = settings.url.replace(wildcard, encodeURIComponent(query));
return settings;
}
function idenityPrepare(query, settings) {
return settings;
}
}
function toLimiter(o) {
var limiter, method, wait;
limiter = o.limiter;
method = o.rateLimitBy;
wait = o.rateLimitWait;
if (!limiter) {
limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);
}
return limiter;
function debounce(wait) {
return function debounce(fn) {
return _.debounce(fn, wait);
};
}
function throttle(wait) {
return function throttle(fn) {
return _.throttle(fn, wait);
};
}
}
function callbackToDeferred(fn) {
return function wrapper(o) {
var deferred = $.Deferred();
fn(o, onSuccess, onError);
return deferred;
function onSuccess(resp) {
_.defer(function() {
deferred.resolve(resp);
});
}
function onError(err) {
_.defer(function() {
deferred.reject(err);
});
}
};
}
}();
var Bloodhound = function() {
"use strict";
var old;
old = window && window.Bloodhound;
function Bloodhound(o) {
o = oParser(o);
this.sorter = o.sorter;
this.identify = o.identify;
this.sufficient = o.sufficient;
this.local = o.local;
this.remote = o.remote ? new Remote(o.remote) : null;
this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;
this.index = new SearchIndex({
identify: this.identify,
datumTokenizer: o.datumTokenizer,
queryTokenizer: o.queryTokenizer
});
o.initialize !== false && this.initialize();
}
Bloodhound.noConflict = function noConflict() {
window && (window.Bloodhound = old);
return Bloodhound;
};
Bloodhound.tokenizers = tokenizers;
_.mixin(Bloodhound.prototype, {
__ttAdapter: function ttAdapter() {
var that = this;
return this.remote ? withAsync : withoutAsync;
function withAsync(query, sync, async) {
return that.search(query, sync, async);
}
function withoutAsync(query, sync) {
return that.search(query, sync);
}
},
_loadPrefetch: function loadPrefetch() {
var that = this, deferred, serialized;
deferred = $.Deferred();
if (!this.prefetch) {
deferred.resolve();
} else if (serialized = this.prefetch.fromCache()) {
this.index.bootstrap(serialized);
deferred.resolve();
} else {
this.prefetch.fromNetwork(done);
}
return deferred.promise();
function done(err, data) {
if (err) {
return deferred.reject();
}
that.add(data);
that.prefetch.store(that.index.serialize());
deferred.resolve();
}
},
_initialize: function initialize() {
var that = this, deferred;
this.clear();
(this.initPromise = this._loadPrefetch()).done(addLocalToIndex);
return this.initPromise;
function addLocalToIndex() {
that.add(that.local);
}
},
initialize: function initialize(force) {
return !this.initPromise || force ? this._initialize() : this.initPromise;
},
add: function add(data) {
this.index.add(data);
return this;
},
get: function get(ids) {
ids = _.isArray(ids) ? ids : [].slice.call(arguments);
return this.index.get(ids);
},
search: function search(query, sync, async) {
var that = this, local;
local = this.sorter(this.index.search(query));
sync(this.remote ? local.slice() : local);
if (this.remote && local.length < this.sufficient) {
this.remote.get(query, processRemote);
} else if (this.remote) {
this.remote.cancelLastRequest();
}
return this;
function processRemote(remote) {
var nonDuplicates = [];
_.each(remote, function(r) {
!_.some(local, function(l) {
return that.identify(r) === that.identify(l);
}) && nonDuplicates.push(r);
});
async && async(nonDuplicates);
}
},
all: function all() {
return this.index.all();
},
clear: function clear() {
this.index.reset();
return this;
},
clearPrefetchCache: function clearPrefetchCache() {
this.prefetch && this.prefetch.clear();
return this;
},
clearRemoteCache: function clearRemoteCache() {
Transport.resetCache();
return this;
},
ttAdapter: function ttAdapter() {
return this.__ttAdapter();
}
});
return Bloodhound;
}();
return Bloodhound;
});
(function(root, factory) {
if (typeof define === "function" && define.amd) {
define("typeahead.js", [ "jquery" ], function(a0) {
return factory(a0);
});
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"));
} else {
factory(jQuery);
}
})(this, function($) {
var _ = function() {
"use strict";
return {
isMsie: function() {
return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
},
isBlankString: function(str) {
return !str || /^\s*$/.test(str);
},
escapeRegExChars: function(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
},
isString: function(obj) {
return typeof obj === "string";
},
isNumber: function(obj) {
return typeof obj === "number";
},
isArray: $.isArray,
isFunction: $.isFunction,
isObject: $.isPlainObject,
isUndefined: function(obj) {
return typeof obj === "undefined";
},
isElement: function(obj) {
return !!(obj && obj.nodeType === 1);
},
isJQuery: function(obj) {
return obj instanceof $;
},
toStr: function toStr(s) {
return _.isUndefined(s) || s === null ? "" : s + "";
},
bind: $.proxy,
each: function(collection, cb) {
$.each(collection, reverseArgs);
function reverseArgs(index, value) {
return cb(value, index);
}
},
map: $.map,
filter: $.grep,
every: function(obj, test) {
var result = true;
if (!obj) {
return result;
}
$.each(obj, function(key, val) {
if (!(result = test.call(null, val, key, obj))) {
return false;
}
});
return !!result;
},
some: function(obj, test) {
var result = false;
if (!obj) {
return result;
}
$.each(obj, function(key, val) {
if (result = test.call(null, val, key, obj)) {
return false;
}
});
return !!result;
},
mixin: $.extend,
identity: function(x) {
return x;
},
clone: function(obj) {
return $.extend(true, {}, obj);
},
getIdGenerator: function() {
var counter = 0;
return function() {
return counter++;
};
},
templatify: function templatify(obj) {
return $.isFunction(obj) ? obj : template;
function template() {
return String(obj);
}
},
defer: function(fn) {
setTimeout(fn, 0);
},
debounce: function(func, wait, immediate) {
var timeout, result;
return function() {
var context = this, args = arguments, later, callNow;
later = function() {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
}
};
callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
}
return result;
};
},
throttle: function(func, wait) {
var context, args, timeout, result, previous, later;
previous = 0;
later = function() {
previous = new Date();
timeout = null;
result = func.apply(context, args);
};
return function() {
var now = new Date(), remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
} else if (!timeout) {
timeout = setTimeout(later, remaining);
}
return result;
};
},
stringify: function(val) {
return _.isString(val) ? val : JSON.stringify(val);
},
noop: function() {}
};
}();
var WWW = function() {
"use strict";
var defaultClassNames = {
wrapper: "twitter-typeahead",
input: "tt-input",
hint: "tt-hint",
menu: "tt-menu",
dataset: "tt-dataset",
suggestion: "tt-suggestion",
selectable: "tt-selectable",
empty: "tt-empty",
open: "tt-open",
cursor: "tt-cursor",
highlight: "tt-highlight"
};
return build;
function build(o) {
var www, classes;
classes = _.mixin({}, defaultClassNames, o);
www = {
css: buildCss(),
classes: classes,
html: buildHtml(classes),
selectors: buildSelectors(classes)
};
return {
css: www.css,
html: www.html,
classes: www.classes,
selectors: www.selectors,
mixin: function(o) {
_.mixin(o, www);
}
};
}
function buildHtml(c) {
return {
wrapper: '<span class="' + c.wrapper + '"></span>',
menu: '<div class="' + c.menu + '"></div>'
};
}
function buildSelectors(classes) {
var selectors = {};
_.each(classes, function(v, k) {
selectors[k] = "." + v;
});
return selectors;
}
function buildCss() {
var css = {
wrapper: {
position: "relative",
display: "inline-block"
},
hint: {
position: "absolute",
top: "0",
left: "0",
borderColor: "transparent",
boxShadow: "none",
opacity: "1"
},
input: {
position: "relative",
verticalAlign: "top",
backgroundColor: "transparent"
},
inputWithNoHint: {
position: "relative",
verticalAlign: "top"
},
menu: {
position: "absolute",
top: "100%",
left: "0",
zIndex: "100",
display: "none"
},
ltr: {
left: "0",
right: "auto"
},
rtl: {
left: "auto",
right: " 0"
}
};
if (_.isMsie()) {
_.mixin(css.input, {
backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
});
}
return css;
}
}();
var EventBus = function() {
"use strict";
var namespace, deprecationMap;
namespace = "typeahead:";
deprecationMap = {
render: "rendered",
cursorchange: "cursorchanged",
select: "selected",
autocomplete: "autocompleted"
};
function EventBus(o) {
if (!o || !o.el) {
$.error("EventBus initialized without el");
}
this.$el = $(o.el);
}
_.mixin(EventBus.prototype, {
_trigger: function(type, args) {
var $e;
$e = $.Event(namespace + type);
(args = args || []).unshift($e);
this.$el.trigger.apply(this.$el, args);
return $e;
},
before: function(type) {
var args, $e;
args = [].slice.call(arguments, 1);
$e = this._trigger("before" + type, args);
return $e.isDefaultPrevented();
},
trigger: function(type) {
var deprecatedType;
this._trigger(type, [].slice.call(arguments, 1));
if (deprecatedType = deprecationMap[type]) {
this._trigger(deprecatedType, [].slice.call(arguments, 1));
}
}
});
return EventBus;
}();
var EventEmitter = function() {
"use strict";
var splitter = /\s+/, nextTick = getNextTick();
return {
onSync: onSync,
onAsync: onAsync,
off: off,
trigger: trigger
};
function on(method, types, cb, context) {
var type;
if (!cb) {
return this;
}
types = types.split(splitter);
cb = context ? bindContext(cb, context) : cb;
this._callbacks = this._callbacks || {};
while (type = types.shift()) {
this._callbacks[type] = this._callbacks[type] || {
sync: [],
async: []
};
this._callbacks[type][method].push(cb);
}
return this;
}
function onAsync(types, cb, context) {
return on.call(this, "async", types, cb, context);
}
function onSync(types, cb, context) {
return on.call(this, "sync", types, cb, context);
}
function off(types) {
var type;
if (!this._callbacks) {
return this;
}
types = types.split(splitter);
while (type = types.shift()) {
delete this._callbacks[type];
}
return this;
}
function trigger(types) {
var type, callbacks, args, syncFlush, asyncFlush;
if (!this._callbacks) {
return this;
}
types = types.split(splitter);
args = [].slice.call(arguments, 1);
while ((type = types.shift()) && (callbacks = this._callbacks[type])) {
syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
syncFlush() && nextTick(asyncFlush);
}
return this;
}
function getFlush(callbacks, context, args) {
return flush;
function flush() {
var cancelled;
for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {
cancelled = callbacks[i].apply(context, args) === false;
}
return !cancelled;
}
}
function getNextTick() {
var nextTickFn;
if (window.setImmediate) {
nextTickFn = function nextTickSetImmediate(fn) {
setImmediate(function() {
fn();
});
};
} else {
nextTickFn = function nextTickSetTimeout(fn) {
setTimeout(function() {
fn();
}, 0);
};
}
return nextTickFn;
}
function bindContext(fn, context) {
return fn.bind ? fn.bind(context) : function() {
fn.apply(context, [].slice.call(arguments, 0));
};
}
}();
var highlight = function(doc) {
"use strict";
var defaults = {
node: null,
pattern: null,
tagName: "strong",
className: null,
wordsOnly: false,
caseSensitive: false
};
return function hightlight(o) {
var regex;
o = _.mixin({}, defaults, o);
if (!o.node || !o.pattern) {
return;
}
o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
traverse(o.node, hightlightTextNode);
function hightlightTextNode(textNode) {
var match, patternNode, wrapperNode;
if (match = regex.exec(textNode.data)) {
wrapperNode = doc.createElement(o.tagName);
o.className && (wrapperNode.className = o.className);
patternNode = textNode.splitText(match.index);
patternNode.splitText(match[0].length);
wrapperNode.appendChild(patternNode.cloneNode(true));
textNode.parentNode.replaceChild(wrapperNode, patternNode);
}
return !!match;
}
function traverse(el, hightlightTextNode) {
var childNode, TEXT_NODE_TYPE = 3;
for (var i = 0; i < el.childNodes.length; i++) {
childNode = el.childNodes[i];
if (childNode.nodeType === TEXT_NODE_TYPE) {
i += hightlightTextNode(childNode) ? 1 : 0;
} else {
traverse(childNode, hightlightTextNode);
}
}
}
};
function getRegex(patterns, caseSensitive, wordsOnly) {
var escapedPatterns = [], regexStr;
for (var i = 0, len = patterns.length; i < len; i++) {
escapedPatterns.push(_.escapeRegExChars(patterns[i]));
}
regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
}
}(window.document);
var Input = function() {
"use strict";
var specialKeyCodeMap;
specialKeyCodeMap = {
9: "tab",
27: "esc",
37: "left",
39: "right",
13: "enter",
38: "up",
40: "down"
};
function Input(o, www) {
o = o || {};
if (!o.input) {
$.error("input is missing");
}
www.mixin(this);
this.$hint = $(o.hint);
this.$input = $(o.input);
this.query = this.$input.val();
this.queryWhenFocused = this.hasFocus() ? this.query : null;
this.$overflowHelper = buildOverflowHelper(this.$input);
this._checkLanguageDirection();
if (this.$hint.length === 0) {
this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
}
}
Input.normalizeQuery = function(str) {
return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " ");
};
_.mixin(Input.prototype, EventEmitter, {
_onBlur: function onBlur() {
this.resetInputValue();
this.trigger("blurred");
},
_onFocus: function onFocus() {
this.queryWhenFocused = this.query;
this.trigger("focused");
},
_onKeydown: function onKeydown($e) {
var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
this._managePreventDefault(keyName, $e);
if (keyName && this._shouldTrigger(keyName, $e)) {
this.trigger(keyName + "Keyed", $e);
}
},
_onInput: function onInput() {
this._setQuery(this.getInputValue());
this.clearHintIfInvalid();
this._checkLanguageDirection();
},
_managePreventDefault: function managePreventDefault(keyName, $e) {
var preventDefault;
switch (keyName) {
case "up":
case "down":
preventDefault = !withModifier($e);
break;
default:
preventDefault = false;
}
preventDefault && $e.preventDefault();
},
_shouldTrigger: function shouldTrigger(keyName, $e) {
var trigger;
switch (keyName) {
case "tab":
trigger = !withModifier($e);
break;
default:
trigger = true;
}
return trigger;
},
_checkLanguageDirection: function checkLanguageDirection() {
var dir = (this.$input.css("direction") || "ltr").toLowerCase();
if (this.dir !== dir) {
this.dir = dir;
this.$hint.attr("dir", dir);
this.trigger("langDirChanged", dir);
}
},
_setQuery: function setQuery(val, silent) {
var areEquivalent, hasDifferentWhitespace;
areEquivalent = areQueriesEquivalent(val, this.query);
hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;
this.query = val;
if (!silent && !areEquivalent) {
this.trigger("queryChanged", this.query);
} else if (!silent && hasDifferentWhitespace) {
this.trigger("whitespaceChanged", this.query);
}
},
bind: function() {
var that = this, onBlur, onFocus, onKeydown, onInput;
onBlur = _.bind(this._onBlur, this);
onFocus = _.bind(this._onFocus, this);
onKeydown = _.bind(this._onKeydown, this);
onInput = _.bind(this._onInput, this);
this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);
if (!_.isMsie() || _.isMsie() > 9) {
this.$input.on("input.tt", onInput);
} else {
this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {
if (specialKeyCodeMap[$e.which || $e.keyCode]) {
return;
}
_.defer(_.bind(that._onInput, that, $e));
});
}
return this;
},
focus: function focus() {
this.$input.focus();
},
blur: function blur() {
this.$input.blur();
},
getLangDir: function getLangDir() {
return this.dir;
},
getQuery: function getQuery() {
return this.query || "";
},
setQuery: function setQuery(val, silent) {
this.setInputValue(val);
this._setQuery(val, silent);
},
hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {
return this.query !== this.queryWhenFocused;
},
getInputValue: function getInputValue() {
return this.$input.val();
},
setInputValue: function setInputValue(value) {
this.$input.val(value);
this.clearHintIfInvalid();
this._checkLanguageDirection();
},
resetInputValue: function resetInputValue() {
this.setInputValue(this.query);
},
getHint: function getHint() {
return this.$hint.val();
},
setHint: function setHint(value) {
this.$hint.val(value);
},
clearHint: function clearHint() {
this.setHint("");
},
clearHintIfInvalid: function clearHintIfInvalid() {
var val, hint, valIsPrefixOfHint, isValid;
val = this.getInputValue();
hint = this.getHint();
valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();
!isValid && this.clearHint();
},
hasFocus: function hasFocus() {
return this.$input.is(":focus");
},
hasOverflow: function hasOverflow() {
var constraint = this.$input.width() - 2;
this.$overflowHelper.text(this.getInputValue());
return this.$overflowHelper.width() >= constraint;
},
isCursorAtEnd: function() {
var valueLength, selectionStart, range;
valueLength = this.$input.val().length;
selectionStart = this.$input[0].selectionStart;
if (_.isNumber(selectionStart)) {
return selectionStart === valueLength;
} else if (document.selection) {
range = document.selection.createRange();
range.moveStart("character", -valueLength);
return valueLength === range.text.length;
}
return true;
},
destroy: function destroy() {
this.$hint.off(".tt");
this.$input.off(".tt");
this.$overflowHelper.remove();
this.$hint = this.$input = this.$overflowHelper = $("<div>");
}
});
return Input;
function buildOverflowHelper($input) {
return $('<pre aria-hidden="true"></pre>').css({
position: "absolute",
visibility: "hidden",
whiteSpace: "pre",
fontFamily: $input.css("font-family"),
fontSize: $input.css("font-size"),
fontStyle: $input.css("font-style"),
fontVariant: $input.css("font-variant"),
fontWeight: $input.css("font-weight"),
wordSpacing: $input.css("word-spacing"),
letterSpacing: $input.css("letter-spacing"),
textIndent: $input.css("text-indent"),
textRendering: $input.css("text-rendering"),
textTransform: $input.css("text-transform")
}).insertAfter($input);
}
function areQueriesEquivalent(a, b) {
return Input.normalizeQuery(a) === Input.normalizeQuery(b);
}
function withModifier($e) {
return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
}
}();
var Dataset = function() {
"use strict";
var keys, nameGenerator;
keys = {
val: "tt-selectable-display",
obj: "tt-selectable-object"
};
nameGenerator = _.getIdGenerator();
function Dataset(o, www) {
o = o || {};
o.templates = o.templates || {};
o.templates.notFound = o.templates.notFound || o.templates.empty;
if (!o.source) {
$.error("missing source");
}
if (!o.node) {
$.error("missing node");
}
if (o.name && !isValidName(o.name)) {
$.error("invalid dataset name: " + o.name);
}
www.mixin(this);
this.highlight = !!o.highlight;
this.name = o.name || nameGenerator();
this.limit = o.limit || 5;
this.displayFn = getDisplayFn(o.display || o.displayKey);
this.templates = getTemplates(o.templates, this.displayFn);
this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
this._resetLastSuggestion();
this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);
}
Dataset.extractData = function extractData(el) {
var $el = $(el);
if ($el.data(keys.obj)) {
return {
val: $el.data(keys.val) || "",
obj: $el.data(keys.obj) || null
};
}
return null;
};
_.mixin(Dataset.prototype, EventEmitter, {
_overwrite: function overwrite(query, suggestions) {
suggestions = suggestions || [];
if (suggestions.length) {
this._renderSuggestions(query, suggestions);
} else if (this.async && this.templates.pending) {
this._renderPending(query);
} else if (!this.async && this.templates.notFound) {
this._renderNotFound(query);
} else {
this._empty();
}
this.trigger("rendered", this.name, suggestions, false);
},
_append: function append(query, suggestions) {
suggestions = suggestions || [];
if (suggestions.length && this.$lastSuggestion.length) {
this._appendSuggestions(query, suggestions);
} else if (suggestions.length) {
this._renderSuggestions(query, suggestions);
} else if (!this.$lastSuggestion.length && this.templates.notFound) {
this._renderNotFound(query);
}
this.trigger("rendered", this.name, suggestions, true);
},
_renderSuggestions: function renderSuggestions(query, suggestions) {
var $fragment;
$fragment = this._getSuggestionsFragment(query, suggestions);
this.$lastSuggestion = $fragment.children().last();
this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));
},
_appendSuggestions: function appendSuggestions(query, suggestions) {
var $fragment, $lastSuggestion;
$fragment = this._getSuggestionsFragment(query, suggestions);
$lastSuggestion = $fragment.children().last();
this.$lastSuggestion.after($fragment);
this.$lastSuggestion = $lastSuggestion;
},
_renderPending: function renderPending(query) {
var template = this.templates.pending;
this._resetLastSuggestion();
template && this.$el.html(template({
query: query,
dataset: this.name
}));
},
_renderNotFound: function renderNotFound(query) {
var template = this.templates.notFound;
this._resetLastSuggestion();
template && this.$el.html(template({
query: query,
dataset: this.name
}));
},
_empty: function empty() {
this.$el.empty();
this._resetLastSuggestion();
},
_getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {
var that = this, fragment;
fragment = document.createDocumentFragment();
_.each(suggestions, function getSuggestionNode(suggestion) {
var $el, context;
context = that._injectQuery(query, suggestion);
$el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);
fragment.appendChild($el[0]);
});
this.highlight && highlight({
className: this.classes.highlight,
node: fragment,
pattern: query
});
return $(fragment);
},
_getFooter: function getFooter(query, suggestions) {
return this.templates.footer ? this.templates.footer({
query: query,
suggestions: suggestions,
dataset: this.name
}) : null;
},
_getHeader: function getHeader(query, suggestions) {
return this.templates.header ? this.templates.header({
query: query,
suggestions: suggestions,
dataset: this.name
}) : null;
},
_resetLastSuggestion: function resetLastSuggestion() {
this.$lastSuggestion = $();
},
_injectQuery: function injectQuery(query, obj) {
return _.isObject(obj) ? _.mixin({
_query: query
}, obj) : obj;
},
update: function update(query) {
var that = this, canceled = false, syncCalled = false, rendered = 0;
this.cancel();
this.cancel = function cancel() {
canceled = true;
that.cancel = $.noop;
that.async && that.trigger("asyncCanceled", query);
};
this.source(query, sync, async);
!syncCalled && sync([]);
function sync(suggestions) {
if (syncCalled) {
return;
}
syncCalled = true;
suggestions = (suggestions || []).slice(0, that.limit);
rendered = suggestions.length;
that._overwrite(query, suggestions);
if (rendered < that.limit && that.async) {
that.trigger("asyncRequested", query);
}
}
function async(suggestions) {
suggestions = suggestions || [];
if (!canceled && rendered < that.limit) {
that.cancel = $.noop;
rendered += suggestions.length;
that._append(query, suggestions.slice(0, that.limit - rendered));
that.async && that.trigger("asyncReceived", query);
}
}
},
cancel: $.noop,
clear: function clear() {
this._empty();
this.cancel();
this.trigger("cleared");
},
isEmpty: function isEmpty() {
return this.$el.is(":empty");
},
destroy: function destroy() {
this.$el = $("<div>");
}
});
return Dataset;
function getDisplayFn(display) {
display = display || _.stringify;
return _.isFunction(display) ? display : displayFn;
function displayFn(obj) {
return obj[display];
}
}
function getTemplates(templates, displayFn) {
return {
notFound: templates.notFound && _.templatify(templates.notFound),
pending: templates.pending && _.templatify(templates.pending),
header: templates.header && _.templatify(templates.header),
footer: templates.footer && _.templatify(templates.footer),
suggestion: templates.suggestion || suggestionTemplate
};
function suggestionTemplate(context) {
return $("<div>").text(displayFn(context));
}
}
function isValidName(str) {
return /^[_a-zA-Z0-9-]+$/.test(str);
}
}();
var Menu = function() {
"use strict";
function Menu(o, www) {
var that = this;
o = o || {};
if (!o.node) {
$.error("node is required");
}
www.mixin(this);
this.$node = $(o.node);
this.query = null;
this.datasets = _.map(o.datasets, initializeDataset);
function initializeDataset(oDataset) {
var node = that.$node.find(oDataset.node).first();
oDataset.node = node.length ? node : $("<div>").appendTo(that.$node);
return new Dataset(oDataset, www);
}
}
_.mixin(Menu.prototype, EventEmitter, {
_onSelectableClick: function onSelectableClick($e) {
this.trigger("selectableClicked", $($e.currentTarget));
},
_onRendered: function onRendered(type, dataset, suggestions, async) {
this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
this.trigger("datasetRendered", dataset, suggestions, async);
},
_onCleared: function onCleared() {
this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
this.trigger("datasetCleared");
},
_propagate: function propagate() {
this.trigger.apply(this, arguments);
},
_allDatasetsEmpty: function allDatasetsEmpty() {
return _.every(this.datasets, isDatasetEmpty);
function isDatasetEmpty(dataset) {
return dataset.isEmpty();
}
},
_getSelectables: function getSelectables() {
return this.$node.find(this.selectors.selectable);
},
_removeCursor: function _removeCursor() {
var $selectable = this.getActiveSelectable();
$selectable && $selectable.removeClass(this.classes.cursor);
},
_ensureVisible: function ensureVisible($el) {
var elTop, elBottom, nodeScrollTop, nodeHeight;
elTop = $el.position().top;
elBottom = elTop + $el.outerHeight(true);
nodeScrollTop = this.$node.scrollTop();
nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10);
if (elTop < 0) {
this.$node.scrollTop(nodeScrollTop + elTop);
} else if (nodeHeight < elBottom) {
this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));
}
},
bind: function() {
var that = this, onSelectableClick;
onSelectableClick = _.bind(this._onSelectableClick, this);
this.$node.on("click.tt", this.selectors.selectable, onSelectableClick);
_.each(this.datasets, function(dataset) {
dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that);
});
return this;
},
isOpen: function isOpen() {
return this.$node.hasClass(this.classes.open);
},
open: function open() {
this.$node.addClass(this.classes.open);
},
close: function close() {
this.$node.removeClass(this.classes.open);
this._removeCursor();
},
setLanguageDirection: function setLanguageDirection(dir) {
this.$node.attr("dir", dir);
},
selectableRelativeToCursor: function selectableRelativeToCursor(delta) {
var $selectables, $oldCursor, oldIndex, newIndex;
$oldCursor = this.getActiveSelectable();
$selectables = this._getSelectables();
oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;
newIndex = oldIndex + delta;
newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;
newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;
return newIndex === -1 ? null : $selectables.eq(newIndex);
},
setCursor: function setCursor($selectable) {
this._removeCursor();
if ($selectable = $selectable && $selectable.first()) {
$selectable.addClass(this.classes.cursor);
this._ensureVisible($selectable);
}
},
getSelectableData: function getSelectableData($el) {
return $el && $el.length ? Dataset.extractData($el) : null;
},
getActiveSelectable: function getActiveSelectable() {
var $selectable = this._getSelectables().filter(this.selectors.cursor).first();
return $selectable.length ? $selectable : null;
},
getTopSelectable: function getTopSelectable() {
var $selectable = this._getSelectables().first();
return $selectable.length ? $selectable : null;
},
update: function update(query) {
var isValidUpdate = query !== this.query;
if (isValidUpdate) {
this.query = query;
_.each(this.datasets, updateDataset);
}
return isValidUpdate;
function updateDataset(dataset) {
dataset.update(query);
}
},
empty: function empty() {
_.each(this.datasets, clearDataset);
this.query = null;
this.$node.addClass(this.classes.empty);
function clearDataset(dataset) {
dataset.clear();
}
},
destroy: function destroy() {
this.$node.off(".tt");
this.$node = $("<div>");
_.each(this.datasets, destroyDataset);
function destroyDataset(dataset) {
dataset.destroy();
}
}
});
return Menu;
}();
var DefaultMenu = function() {
"use strict";
var s = Menu.prototype;
function DefaultMenu() {
Menu.apply(this, [].slice.call(arguments, 0));
}
_.mixin(DefaultMenu.prototype, Menu.prototype, {
open: function open() {
!this._allDatasetsEmpty() && this._show();
return s.open.apply(this, [].slice.call(arguments, 0));
},
close: function close() {
this._hide();
return s.close.apply(this, [].slice.call(arguments, 0));
},
_onRendered: function onRendered() {
if (this._allDatasetsEmpty()) {
this._hide();
} else {
this.isOpen() && this._show();
}
return s._onRendered.apply(this, [].slice.call(arguments, 0));
},
_onCleared: function onCleared() {
if (this._allDatasetsEmpty()) {
this._hide();
} else {
this.isOpen() && this._show();
}
return s._onCleared.apply(this, [].slice.call(arguments, 0));
},
setLanguageDirection: function setLanguageDirection(dir) {
this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);
return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));
},
_hide: function hide() {
this.$node.hide();
},
_show: function show() {
this.$node.css("display", "block");
}
});
return DefaultMenu;
}();
var Typeahead = function() {
"use strict";
function Typeahead(o, www) {
var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;
o = o || {};
if (!o.input) {
$.error("missing input");
}
if (!o.menu) {
$.error("missing menu");
}
if (!o.eventBus) {
$.error("missing event bus");
}
www.mixin(this);
this.eventBus = o.eventBus;
this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
this.input = o.input;
this.menu = o.menu;
this.enabled = true;
this.active = false;
this.input.hasFocus() && this.activate();
this.dir = this.input.getLangDir();
this._hacks();
this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this);
onFocused = c(this, "activate", "open", "_onFocused");
onBlurred = c(this, "deactivate", "_onBlurred");
onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed");
onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed");
onEscKeyed = c(this, "isActive", "_onEscKeyed");
onUpKeyed = c(this, "isActive", "open", "_onUpKeyed");
onDownKeyed = c(this, "isActive", "open", "_onDownKeyed");
onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed");
onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed");
onQueryChanged = c(this, "_openIfActive", "_onQueryChanged");
onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged");
this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this);
}
_.mixin(Typeahead.prototype, {
_hacks: function hacks() {
var $input, $menu;
$input = this.input.$input || $("<div>");
$menu = this.menu.$node || $("<div>");
$input.on("blur.tt", function($e) {
var active, isActive, hasActive;
active = document.activeElement;
isActive = $menu.is(active);
hasActive = $menu.has(active).length > 0;
if (_.isMsie() && (isActive || hasActive)) {
$e.preventDefault();
$e.stopImmediatePropagation();
_.defer(function() {
$input.focus();
});
}
});
$menu.on("mousedown.tt", function($e) {
$e.preventDefault();
});
},
_onSelectableClicked: function onSelectableClicked(type, $el) {
this.select($el);
},
_onDatasetCleared: function onDatasetCleared() {
this._updateHint();
},
_onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {
this._updateHint();
this.eventBus.trigger("render", suggestions, async, dataset);
},
_onAsyncRequested: function onAsyncRequested(type, dataset, query) {
this.eventBus.trigger("asyncrequest", query, dataset);
},
_onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
this.eventBus.trigger("asynccancel", query, dataset);
},
_onAsyncReceived: function onAsyncReceived(type, dataset, query) {
this.eventBus.trigger("asyncreceive", query, dataset);
},
_onFocused: function onFocused() {
this._minLengthMet() && this.menu.update(this.input.getQuery());
},
_onBlurred: function onBlurred() {
if (this.input.hasQueryChangedSinceLastFocus()) {
this.eventBus.trigger("change", this.input.getQuery());
}
},
_onEnterKeyed: function onEnterKeyed(type, $e) {
var $selectable;
if ($selectable = this.menu.getActiveSelectable()) {
this.select($selectable) && $e.preventDefault();
}
},
_onTabKeyed: function onTabKeyed(type, $e) {
var $selectable;
if ($selectable = this.menu.getActiveSelectable()) {
this.select($selectable) && $e.preventDefault();
} else if ($selectable = this.menu.getTopSelectable()) {
this.autocomplete($selectable) && $e.preventDefault();
}
},
_onEscKeyed: function onEscKeyed() {
this.close();
},
_onUpKeyed: function onUpKeyed() {
this.moveCursor(-1);
},
_onDownKeyed: function onDownKeyed() {
this.moveCursor(+1);
},
_onLeftKeyed: function onLeftKeyed() {
if (this.dir === "rtl" && this.input.isCursorAtEnd()) {
this.autocomplete(this.menu.getTopSelectable());
}
},
_onRightKeyed: function onRightKeyed() {
if (this.dir === "ltr" && this.input.isCursorAtEnd()) {
this.autocomplete(this.menu.getTopSelectable());
}
},
_onQueryChanged: function onQueryChanged(e, query) {
this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
},
_onWhitespaceChanged: function onWhitespaceChanged() {
this._updateHint();
},
_onLangDirChanged: function onLangDirChanged(e, dir) {
if (this.dir !== dir) {
this.dir = dir;
this.menu.setLanguageDirection(dir);
}
},
_openIfActive: function openIfActive() {
this.isActive() && this.open();
},
_minLengthMet: function minLengthMet(query) {
query = _.isString(query) ? query : this.input.getQuery() || "";
return query.length >= this.minLength;
},
_updateHint: function updateHint() {
var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
$selectable = this.menu.getTopSelectable();
data = this.menu.getSelectableData($selectable);
val = this.input.getInputValue();
if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {
query = Input.normalizeQuery(val);
escapedQuery = _.escapeRegExChars(query);
frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
match = frontMatchRegEx.exec(data.val);
match && this.input.setHint(val + match[1]);
} else {
this.input.clearHint();
}
},
isEnabled: function isEnabled() {
return this.enabled;
},
enable: function enable() {
this.enabled = true;
},
disable: function disable() {
this.enabled = false;
},
isActive: function isActive() {
return this.active;
},
activate: function activate() {
if (this.isActive()) {
return true;
} else if (!this.isEnabled() || this.eventBus.before("active")) {
return false;
} else {
this.active = true;
this.eventBus.trigger("active");
return true;
}
},
deactivate: function deactivate() {
if (!this.isActive()) {
return true;
} else if (this.eventBus.before("idle")) {
return false;
} else {
this.active = false;
this.close();
this.eventBus.trigger("idle");
return true;
}
},
isOpen: function isOpen() {
return this.menu.isOpen();
},
open: function open() {
if (!this.isOpen() && !this.eventBus.before("open")) {
this.menu.open();
this._updateHint();
this.eventBus.trigger("open");
}
return this.isOpen();
},
close: function close() {
if (this.isOpen() && !this.eventBus.before("close")) {
this.menu.close();
this.input.clearHint();
this.input.resetInputValue();
this.eventBus.trigger("close");
}
return !this.isOpen();
},
setVal: function setVal(val) {
this.input.setQuery(_.toStr(val));
},
getVal: function getVal() {
return this.input.getQuery();
},
select: function select($selectable) {
var data = this.menu.getSelectableData($selectable);
if (data && !this.eventBus.before("select", data.obj)) {
this.input.setQuery(data.val, true);
this.eventBus.trigger("select", data.obj);
this.close();
return true;
}
return false;
},
autocomplete: function autocomplete($selectable) {
var query, data, isValid;
query = this.input.getQuery();
data = this.menu.getSelectableData($selectable);
isValid = data && query !== data.val;
if (isValid && !this.eventBus.before("autocomplete", data.obj)) {
this.input.setQuery(data.val);
this.eventBus.trigger("autocomplete", data.obj);
return true;
}
return false;
},
moveCursor: function moveCursor(delta) {
var query, $candidate, data, payload, cancelMove;
query = this.input.getQuery();
$candidate = this.menu.selectableRelativeToCursor(delta);
data = this.menu.getSelectableData($candidate);
payload = data ? data.obj : null;
cancelMove = this._minLengthMet() && this.menu.update(query);
if (!cancelMove && !this.eventBus.before("cursorchange", payload)) {
this.menu.setCursor($candidate);
if (data) {
this.input.setInputValue(data.val);
} else {
this.input.resetInputValue();
this._updateHint();
}
this.eventBus.trigger("cursorchange", payload);
return true;
}
return false;
},
destroy: function destroy() {
this.input.destroy();
this.menu.destroy();
}
});
return Typeahead;
function c(ctx) {
var methods = [].slice.call(arguments, 1);
return function() {
var args = [].slice.call(arguments);
_.each(methods, function(method) {
return ctx[method].apply(ctx, args);
});
};
}
}();
(function() {
"use strict";
var old, keys, methods;
old = $.fn.typeahead;
keys = {
www: "tt-www",
attrs: "tt-attrs",
typeahead: "tt-typeahead"
};
methods = {
initialize: function initialize(o, datasets) {
var www;
datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
o = o || {};
www = WWW(o.classNames);
return this.each(attach);
function attach() {
var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor;
_.each(datasets, function(d) {
d.highlight = !!o.highlight;
});
$input = $(this);
$wrapper = $(www.html.wrapper);
$hint = $elOrNull(o.hint);
$menu = $elOrNull(o.menu);
defaultHint = o.hint !== false && !$hint;
defaultMenu = o.menu !== false && !$menu;
defaultHint && ($hint = buildHintFromInput($input, www));
defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
$hint && $hint.val("");
$input = prepInput($input, www);
if (defaultHint || defaultMenu) {
$wrapper.css(www.css.wrapper);
$input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);
$input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);
}
MenuConstructor = defaultMenu ? DefaultMenu : Menu;
eventBus = new EventBus({
el: $input
});
input = new Input({
hint: $hint,
input: $input
}, www);
menu = new MenuConstructor({
node: $menu,
datasets: datasets
}, www);
typeahead = new Typeahead({
input: input,
menu: menu,
eventBus: eventBus,
minLength: o.minLength
}, www);
$input.data(keys.www, www);
$input.data(keys.typeahead, typeahead);
}
},
isEnabled: function isEnabled() {
var enabled;
ttEach(this.first(), function(t) {
enabled = t.isEnabled();
});
return enabled;
},
enable: function enable() {
ttEach(this, function(t) {
t.enable();
});
return this;
},
disable: function disable() {
ttEach(this, function(t) {
t.disable();
});
return this;
},
isActive: function isActive() {
var active;
ttEach(this.first(), function(t) {
active = t.isActive();
});
return active;
},
activate: function activate() {
ttEach(this, function(t) {
t.activate();
});
return this;
},
deactivate: function deactivate() {
ttEach(this, function(t) {
t.deactivate();
});
return this;
},
isOpen: function isOpen() {
var open;
ttEach(this.first(), function(t) {
open = t.isOpen();
});
return open;
},
open: function open() {
ttEach(this, function(t) {
t.open();
});
return this;
},
close: function close() {
ttEach(this, function(t) {
t.close();
});
return this;
},
select: function select(el) {
var success = false, $el = $(el);
ttEach(this.first(), function(t) {
success = t.select($el);
});
return success;
},
autocomplete: function autocomplete(el) {
var success = false, $el = $(el);
ttEach(this.first(), function(t) {
success = t.autocomplete($el);
});
return success;
},
moveCursor: function moveCursoe(delta) {
var success = false;
ttEach(this.first(), function(t) {
success = t.moveCursor(delta);
});
return success;
},
val: function val(newVal) {
var query;
if (!arguments.length) {
ttEach(this.first(), function(t) {
query = t.getVal();
});
return query;
} else {
ttEach(this, function(t) {
t.setVal(newVal);
});
return this;
}
},
destroy: function destroy() {
ttEach(this, function(typeahead, $input) {
revert($input);
typeahead.destroy();
});
return this;
}
};
$.fn.typeahead = function(method) {
if (methods[method]) {
return methods[method].apply(this, [].slice.call(arguments, 1));
} else {
return methods.initialize.apply(this, arguments);
}
};
$.fn.typeahead.noConflict = function noConflict() {
$.fn.typeahead = old;
return this;
};
function ttEach($els, fn) {
$els.each(function() {
var $input = $(this), typeahead;
(typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);
});
}
function buildHintFromInput($input, www) {
return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({
autocomplete: "off",
spellcheck: "false",
tabindex: -1
});
}
function prepInput($input, www) {
$input.data(keys.attrs, {
dir: $input.attr("dir"),
autocomplete: $input.attr("autocomplete"),
spellcheck: $input.attr("spellcheck"),
style: $input.attr("style")
});
$input.addClass(www.classes.input).attr({
autocomplete: "off",
spellcheck: false
});
try {
!$input.attr("dir") && $input.attr("dir", "auto");
} catch (e) {}
return $input;
}
function getBackgroundStyles($el) {
return {
backgroundAttachment: $el.css("background-attachment"),
backgroundClip: $el.css("background-clip"),
backgroundColor: $el.css("background-color"),
backgroundImage: $el.css("background-image"),
backgroundOrigin: $el.css("background-origin"),
backgroundPosition: $el.css("background-position"),
backgroundRepeat: $el.css("background-repeat"),
backgroundSize: $el.css("background-size")
};
}
function revert($input) {
var www, $wrapper;
www = $input.data(keys.www);
$wrapper = $input.parent().filter(www.selectors.wrapper);
_.each($input.data(keys.attrs), function(val, key) {
_.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
});
$input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
if ($wrapper.length) {
$input.detach().insertAfter($wrapper);
$wrapper.remove();
}
}
function $elOrNull(obj) {
var isValid, $el;
isValid = _.isJQuery(obj) || _.isElement(obj);
$el = isValid ? $(obj).first() : [];
return $el.length ? $el : null;
}
})();
});

typeahead.css:

.typeahead,.tt-query,.tt-hint {
width: 396px;
height: 30px;
padding: 8px 12px;
font-size: 24px;
line-height: 30px;
border: 2px solid #ccc;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
outline: none;
}
.typeahead {
background-color: #fff;
}
.typeahead:focus {
border: 2px solid #0097cf;
}
.tt-query {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.tt-hint {
color: #999
}
.tt-menu {
width: 422px;
margin: 12px 0;
padding: 8px 0;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
box-shadow: 0 5px 10px rgba(0,0,0,.2);
}
.tt-suggestion {
padding: 3px 20px;
font-size: 18px;
line-height: 24px;
}
.tt-suggestion:hover {
cursor: pointer;
color: #fff;
background-color: #0097cf;
}
.tt-suggestion.tt-cursor {
color: #fff;
background-color: #0097cf;
}
.tt-suggestion p {
margin: 0;
}
.gist {
font-size: 14px;
}
/* example specific styles */
/* ----------------------- */
#custom-templates .empty-message {
padding: 5px 10px;
text-align: center;
}
#multiple-datasets .league-name {
margin: 0 20px 5px 20px;
padding: 3px 0;
border-bottom: 1px solid #ccc;
}
#scrollable-dropdown-menu .tt-menu {
max-height: 150px;
overflow-y: auto;
}
#rtl-support .tt-menu {
text-align: right;
}

以上所述是小編給大家介紹的Bootstrap3使用typeahead插件實現(xiàn)自動補(bǔ)全功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • JavaScript實現(xiàn)文字展開和收起效果

    JavaScript實現(xiàn)文字展開和收起效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)文字展開和收起效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • leaflet基本使用示例教程

    leaflet基本使用示例教程

    這篇文章主要介紹了leaflet基本使用示例教程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • JS輪播圖的實現(xiàn)方法

    JS輪播圖的實現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了JS輪播圖的實現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 在多個頁面使用同一個HTML片段《續(xù)》

    在多個頁面使用同一個HTML片段《續(xù)》

    上一篇文章中我們使用textarea來模擬AJAX的返回結(jié)果,造成了一些誤解。 這里我們首先用asp.net的Generic Handler做一個簡單的后臺來重現(xiàn)這個AJAX過程。
    2011-03-03
  • JS實現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果

    JS實現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果

    這篇文章主要介紹了JS實現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果,涉及javascript鼠標(biāo)事件及頁面元素顯示的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 深入理解typescript中的infer關(guān)鍵字的使用

    深入理解typescript中的infer關(guān)鍵字的使用

    infer 這個關(guān)鍵字,整理記錄一下,避免后面忘記了。具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Javascript的異步函數(shù)和Promise對象你了解嗎

    Javascript的異步函數(shù)和Promise對象你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Javascript異步函數(shù)和Promise對象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • JS簡單實現(xiàn)數(shù)組去重的方法示例

    JS簡單實現(xiàn)數(shù)組去重的方法示例

    這篇文章主要介紹了JS簡單實現(xiàn)數(shù)組去重的方法,涉及javascript數(shù)組的遍歷、判斷及賦值操作,代碼非常簡單易懂,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • 火狐和ie下獲取javascript 獲取event的方法(推薦)

    火狐和ie下獲取javascript 獲取event的方法(推薦)

    下面小編就為大家?guī)硪黄鸷蚷e下獲取javascript 獲取event的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • jQuery實現(xiàn)動態(tài)生成表格并為行綁定單擊變色動作的方法

    jQuery實現(xiàn)動態(tài)生成表格并為行綁定單擊變色動作的方法

    這篇文章主要介紹了jQuery實現(xiàn)動態(tài)生成表格并為行綁定單擊變色動作的方法,涉及jQuery頁面元素遍歷與事件動態(tài)響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04

最新評論

欧美80老妇人性视频| 国产自拍在线观看成人| 国产视频一区在线观看| 欧美va亚洲va天堂va| 国产伦精品一区二区三区竹菊| 99人妻视频免费在线| 黄片三级三级三级在线观看| 黄色成人在线中文字幕| 夜夜嗨av蜜臀av| 亚洲图片欧美校园春色| 欧美3p在线观看一区二区三区| 亚洲一区二区三区五区| 中文字幕在线观看国产片| 黄色片黄色片wyaa| 欧亚日韩一区二区三区观看视频| 中文字幕,亚洲人妻| 美女福利写真在线观看视频| 亚洲 图片 欧美 图片| 国产精品一区二区三区蜜臀av| 成人性爱在线看四区| 蜜臀av久久久久蜜臀av麻豆| 含骚鸡巴玩逼逼视频| 91老师蜜桃臀大屁股| 五十路息与子猛烈交尾视频| 免费啪啪啪在线观看视频| 中文字幕国产专区欧美激情| 美女福利视频导航网站| 日本一道二三区视频久久| 我想看操逼黄色大片| 国产高潮无码喷水AV片在线观看| 亚洲特黄aaaa片| 婷婷午夜国产精品久久久| chinese国产盗摄一区二区| 蜜桃久久久久久久人妻| 精品一区二区三区三区色爱| 日韩亚洲高清在线观看| 日本高清在线不卡一区二区 | 91香蕉成人app下载| 天天干夜夜操啊啊啊| 欧美亚洲国产成人免费在线| 91精品综合久久久久3d动漫| 一区二区视频在线观看免费观看| 亚洲一级 片内射视正片| 中文字幕免费福利视频6| 激情内射在线免费观看| 9l人妻人人爽人人爽| 亚洲va欧美va人人爽3p| 国产精品黄色的av| 午夜精品福利一区二区三区p| 亚洲熟妇x久久av久久| asmr福利视频在线观看| 亚洲一区二区三区偷拍女厕91| av俺也去在线播放| 一色桃子人妻一区二区三区| 日日摸夜夜添夜夜添毛片性色av| 中国熟女一区二区性xx| 国产剧情演绎系列丝袜高跟| 亚洲国产在线精品国偷产拍| 女蜜桃臀紧身瑜伽裤| 青青青视频手机在线观看| 国产麻豆乱子伦午夜视频观看| 5528327男人天堂| 国产之丝袜脚在线一区二区三区| 中文字幕无码一区二区免费| 91成人在线观看免费视频| 午夜福利人人妻人人澡人人爽| 欲满人妻中文字幕在线| 91精品综合久久久久3d动漫 | 插小穴高清无码中文字幕| 五十路熟女人妻一区二区9933| 男女啪啪视频免费在线观看 | 大黑人性xxxxbbbb| 一区二区三区蜜臀在线| 99久久久无码国产精品性出奶水| 人妻3p真实偷拍一二区| 老司机99精品视频在线观看| 2019av在线视频| 国产免费av一区二区凹凸四季| 粉嫩av懂色av蜜臀av| 黄色在线观看免费观看在线 | 欧美激情电影免费在线| 国产女人露脸高潮对白视频| 老熟妇xxxhd老熟女| 白白操白白色在线免费视频| 揄拍成人国产精品免费看视频| 亚洲精品国品乱码久久久久| 精品国产成人亚洲午夜| 天天做天天干天天舔| 男人天堂av天天操| 中文字幕之无码色多多| 天天日天天干天天插舔舔| 91亚洲国产成人精品性色| 色吉吉影音天天干天天操 | lutube在线成人免费看| 亚洲av极品精品在线观看| 欧美中国日韩久久精品| 黄片三级三级三级在线观看| 免费岛国喷水视频在线观看| 日韩一个色综合导航| 欧美成人综合色在线噜噜| 2o22av在线视频| 日韩人妻在线视频免费| 91极品新人『兔兔』精品新作| 18禁美女无遮挡免费| 男人靠女人的逼视频| 精品区一区二区三区四区人妻| 日韩成人综艺在线播放| 夜色撩人久久7777| 大香蕉大香蕉大香蕉大香蕉大香蕉| 国产高清精品极品美女| 亚洲精品福利网站图片| 成熟熟女国产精品一区| 国产午夜激情福利小视频在线| 日本啪啪啪啪啪啪啪| 视频二区在线视频观看| 亚洲va天堂va国产va久| 亚洲自拍偷拍综合色| 中文字幕人妻一区二区视频| 天堂资源网av中文字幕| 亚洲男人让女人爽的视频| 免费看国产又粗又猛又爽又黄视频 | 五十路av熟女松本翔子| 91精品综合久久久久3d动漫| 激情综合治理六月婷婷| 久久久久久久精品成人热| 亚洲免费国产在线日韩| 免费av岛国天堂网站| 国产片免费观看在线观看| 日本中文字幕一二区视频| 白白操白白色在线免费视频| 适合午夜一个人看的视频| 日本www中文字幕| 很黄很污很色的午夜网站在线观看 | 日本午夜久久女同精女女| 成人sm视频在线观看| 国产chinesehd精品麻豆| 9久在线视频只有精品| 亚洲成av人无码不卡影片一| 3337p日本欧洲大胆色噜噜| 班长撕开乳罩揉我胸好爽| 伊人网中文字幕在线视频| 亚洲熟妇久久无码精品| 成人H精品动漫在线无码播放| 大鸡巴操b视频在线| av天堂中文字幕最新| 日本黄在免费看视频| 新婚人妻聚会被中出| 欧洲国产成人精品91铁牛tv| 日韩不卡中文在线视频网站| 亚洲熟妇x久久av久久| 伊人综合免费在线视频| 免费av岛国天堂网站| 一区二区三区久久久91| 40道精品招牌菜特色| 人人妻人人澡人人爽人人dvl| 国产亚洲国产av网站在线| 亚洲区欧美区另类最新章节| 亚洲午夜在线视频福利| 人妻少妇精品久久久久久| 91久久综合男人天堂| av手机在线免费观看日韩av| 97超碰人人搞人人| 伊人精品福利综合导航| 午夜福利人人妻人人澡人人爽| 丝袜国产专区在线观看| av森泽佳奈在线观看| 国产成人精品福利短视频| 午夜在线一区二区免费| mm131美女午夜爽爽爽| 日韩精品中文字幕播放| 99人妻视频免费在线| 日本韩国在线观看一区二区| 国产aⅴ一线在线观看| 亚洲激情,偷拍视频| 久久久久久性虐视频| 亚洲成人av在线一区二区| 99久久久无码国产精品性出奶水 | 亚洲一级av大片免费观看| 婷婷综合亚洲爱久久| 少妇ww搡性bbb91| 国产中文精品在线观看| 人妻丝袜榨强中文字幕| 一区二区三区美女毛片| 久久h视频在线观看| 免费岛国喷水视频在线观看 | 国产chinesehd精品麻豆| 午夜激情高清在线观看| 中文字幕AV在线免费看 | 天天操天天污天天射| 青青草在观免费国产精品| 中文字幕欧美日韩射射一| 美女操逼免费短视频下载链接| 黄色片黄色片wyaa| av手机在线免费观看日韩av| 中文乱理伦片在线观看| 国产伊人免费在线播放| 亚洲免费视频欧洲免费视频| 中英文字幕av一区| 中文字幕1卡1区2区3区| 亚洲av极品精品在线观看| 国产超码片内射在线| 日本在线一区二区不卡视频| 国产卡一卡二卡三乱码手机| 自拍偷区二区三区麻豆| 一级A一级a爰片免费免会员| 日本乱人一区二区三区| 亚洲无码一区在线影院| 亚洲的电影一区二区三区 | 激情啪啪啪啪一区二区三区| 日韩不卡中文在线视频网站| 2021年国产精品自拍| 国产片免费观看在线观看| 亚洲综合另类欧美久久| 精品亚洲中文字幕av| 国产日韩一区二区在线看| 少妇系列一区二区三区视频| 天天操天天射天天操天天天| 家庭女教师中文字幕在线播放| 天天日天天鲁天天操| 特一级特级黄色网片| 91小伙伴中女熟女高潮| 大肉大捧一进一出好爽在线视频 | 在线视频免费观看网| av线天堂在线观看| 亚洲伊人久久精品影院一美女洗澡 | 人妻无码中文字幕专区| 最新91精品视频在线| 97人人妻人人澡人人爽人人精品| 精品黑人一区二区三区久久国产 | 91免费放福利在线观看| 成年人黄视频在线观看| 亚洲综合色在线免费观看| 国产日本精品久久久久久久| 人妻少妇av在线观看| 天天操天天弄天天射| 亚洲天堂第一页中文字幕| 天天色天天操天天透| 亚洲少妇人妻无码精品| 漂亮 人妻被中出中文| 1000小视频在线| 欧美日本国产自视大全| 硬鸡巴动态操女人逼视频| 亚洲一区制服丝袜美腿| 午夜激情精品福利视频| 中文字幕高清在线免费播放| 97少妇精品在线观看| 天堂资源网av中文字幕| 亚洲熟色妇av日韩熟色妇在线| 狠狠躁狠狠爱网站视频| 精品91自产拍在线观看一区| 天天干天天日天天干天天操| 人人妻人人爽人人添夜| 热久久只有这里有精品| 在线观看av2025| 韩国一级特黄大片做受| 日日摸夜夜添夜夜添毛片性色av| 日本性感美女三级视频| 午夜免费体验区在线观看| 免费成人av中文字幕| 91久久综合男人天堂| 任你操任你干精品在线视频| 成人乱码一区二区三区av| 亚洲1区2区3区精华液| 国产在线免费观看成人| 亚洲va国产va欧美va在线| 又黄又刺激的午夜小视频| 天天射,天天操,天天说| 天天夜天天日天天日| 欧美日韩中文字幕欧美| 国产普通话插插视频| 亚洲精品 日韩电影| 日本真人性生活视频免费看| 国产V亚洲V天堂无码欠欠| 在线国产日韩欧美视频| 久久久久久久久久性潮| 国内自拍第一页在线观看| av黄色成人在线观看| 初美沙希中文字幕在线| 中国产一级黄片免费视频播放| 欧美黄片精彩在线免费观看| wwwxxx一级黄色片| 精品高潮呻吟久久av| 一级A一级a爰片免费免会员| 天天躁日日躁狠狠躁av麻豆| 在线成人日韩av电影| 久精品人妻一区二区三区| 成人av免费不卡在线观看| 国产精品黄色的av| 日本人妻精品久久久久久| 亚洲另类综合一区小说| 成年人该看的视频黄免费| 中文字幕一区二 区二三区四区| 日韩欧美国产一区ab| 亚洲精品av在线观看| 人人妻人人爱人人草| 国产夫妻视频在线观看免费| 国产性生活中老年人视频网站| 亚洲精品在线资源站| 久久久极品久久蜜桃| 婷婷激情四射在线观看视频| 日比视频老公慢点好舒服啊| sspd152中文字幕在线| 2022国产综合在线干| 国产精品久久久黄网站| 亚洲欧美成人综合在线观看| 亚洲天天干 夜夜操| 99婷婷在线观看视频| 亚洲人妻av毛片在线| 红杏久久av人妻一区| 亚洲av色香蕉一区二区三区 | 天天做天天干天天舔| 亚欧在线视频你懂的| 欧美viboss性丰满| 亚洲欧洲一区二区在线观看| 亚洲欧美一区二区三区爱爱动图 | 国产性感美女福利视频| 日本免费一级黄色录像| 婷婷五月亚洲综合在线| 最新的中文字幕 亚洲| av线天堂在线观看| 视频二区在线视频观看| 91在线视频在线精品3| 中文乱理伦片在线观看| 亚洲av色图18p| 午夜精品福利一区二区三区p| 国产精品系列在线观看一区二区| 福利视频广场一区二区| 欧美偷拍亚洲一区二区| sw137 中文字幕 在线| 少妇人妻久久久久视频黄片| 视频一区 视频二区 视频| 国产日韩一区二区在线看| 自拍 日韩 欧美激情| 视频二区在线视频观看| 天干天天天色天天日天天射| 午夜毛片不卡在线看| 国产麻豆91在线视频| 天天日天天操天天摸天天舔| 动色av一区二区三区| 亚洲黄色av网站免费播放| 特级无码毛片免费视频播放| 中文字幕高清免费在线人妻| 欧美在线精品一区二区三区视频| 超级碰碰在线视频免费观看| 极品粉嫩小泬白浆20p主播 | 大陆胖女人与丈夫操b国语高清 | 亚洲国产在人线放午夜| 国产视频在线视频播放| 美女视频福利免费看| 亚洲精品乱码久久久久久密桃明| 中文字幕 亚洲av| 黄色视频在线观看高清无码| 日韩午夜福利精品试看| 伊人成人综合开心网| sejizz在线视频| 亚洲自拍偷拍精品网| 99国内小视频在现欢看| 大骚逼91抽插出水视频| 免费av岛国天堂网站| 日韩精品电影亚洲一区| 国产97在线视频观看| 欧美偷拍亚洲一区二区| 精产国品久久一二三产区区别| 天天插天天狠天天操| 适合午夜一个人看的视频| 亚洲中文字幕乱码区| 色花堂在线av中文字幕九九| 成人午夜电影在线观看 久久| 2020韩国午夜女主播在线| 99热这里只有精品中文| 日韩欧美在线观看不卡一区二区| 色综合久久无码中文字幕波多| 国产高清97在线观看视频| 成人高清在线观看视频| 日本韩国免费一区二区三区视频| 国产在线自在拍91国语自产精品| 加勒比视频在线免费观看| 天天操天天干天天日狠狠插| 女蜜桃臀紧身瑜伽裤| 国产日本欧美亚洲精品视| 最新的中文字幕 亚洲| 日本女人一级免费片| 久久这里只有精品热视频| 欧美精产国品一二三区| 亚洲一区二区三区精品视频在线 | 少妇与子乱在线观看| 欧美视频一区免费在线| 国内自拍第一页在线观看| 红桃av成人在线观看| 亚洲精品在线资源站| www骚国产精品视频| 91啪国自产中文字幕在线| 这里只有精品双飞在线播放| 日本三极片中文字幕| 亚洲欧美激情中文字幕| 中文字幕日本人妻中出| chinese国产盗摄一区二区| 中文字幕乱码人妻电影| 日本xx片在线观看| 国产欧美精品不卡在线| 亚洲欧美一区二区三区爱爱动图| 亚洲人妻30pwc| 一区二区三区四区中文| 久久永久免费精品人妻专区| 日韩欧美一级aa大片| 欧美区一区二区三视频| av在线播放国产不卡| 国产极品精品免费视频| 亚洲色偷偷综合亚洲AV伊人| 4个黑人操素人视频网站精品91| 在线视频免费观看网| 护士特殊服务久久久久久久| 天天操天天干天天日狠狠插| 日日夜夜狠狠干视频| 亚洲在线一区二区欧美| 国产成人综合一区2区| 2021久久免费视频| 欧美成人综合视频一区二区| 日本人妻少妇18—xx| 亚洲一区二区人妻av| 性色蜜臀av一区二区三区| 男人的天堂av日韩亚洲| av线天堂在线观看| 无码日韩人妻精品久久| 91国内精品久久久久精品一| 欧美日本在线观看一区二区| 久草免费人妻视频在线| 国产成人精品久久二区91| 天天射夜夜操综合网| 红杏久久av人妻一区| 成人H精品动漫在线无码播放| 美洲精品一二三产区区别| 欧美在线精品一区二区三区视频 | 国产亚洲视频在线观看| 成人性爱在线看四区| 99精品国产aⅴ在线观看| 中文 成人 在线 视频| 99久久99一区二区三区| 传媒在线播放国产精品一区| 日韩美女综合中文字幕pp| 大骚逼91抽插出水视频| 99久久超碰人妻国产| 97国产在线观看高清| 水蜜桃一区二区三区在线观看视频| 黄色中文字幕在线播放| 少妇高潮一区二区三区| 91九色porny蝌蚪国产成人| 国产精品日韩欧美一区二区| 91老师蜜桃臀大屁股| 亚洲 图片 欧美 图片| 中文字幕第1页av一天堂网| 亚洲图库另类图片区| 午夜精品福利一区二区三区p | 天天干天天日天天干天天操| 国产精彩福利精品视频| 美女大bxxxx内射| 77久久久久国产精产品| 特级无码毛片免费视频播放| 在线不卡成人黄色精品| 年轻的人妻被夫上司侵犯| 啪啪啪操人视频在线播放| 大白屁股精品视频国产| 亚洲成人三级在线播放| 福利在线视频网址导航| 888欧美视频在线| 99久久超碰人妻国产| 大白屁股精品视频国产| av在线观看网址av| 日韩av熟妇在线观看| 天天做天天干天天舔| 国产高清在线在线视频| 日日夜夜大香蕉伊人| 欧洲精品第一页欧洲精品亚洲| 男生用鸡操女生视频动漫| 偷青青国产精品青青在线观看| 精品人妻伦一二三区久| 欧美日韩情色在线观看| 干逼又爽又黄又免费的视频| 午夜国产免费福利av| 99热久久这里只有精品| 欧美一区二区三区高清不卡tv| 在线制服丝袜中文字幕| 一区二区视频视频视频| 播放日本一区二区三区电影| 亚洲一区二区激情在线| 亚洲欧美自拍另类图片| 欧美精产国品一二三产品区别大吗| 国产91精品拍在线观看| 天天想要天天操天天干| 中文字幕人妻被公上司喝醉在线| 东京干手机福利视频| 日本真人性生活视频免费看| 成年人啪啪视频在线观看| 久久机热/这里只有| 欧美成人精品在线观看| 人妻无码色噜噜狠狠狠狠色| 都市激情校园春色狠狠| 99精品亚洲av无码国产另类| 黄色av网站免费在线| 国产又粗又硬又大视频| 国产女人露脸高潮对白视频| 夜女神免费福利视频| www,久久久,com| 欧美综合婷婷欧美综合| 孕妇奶水仑乱A级毛片免费看| av大全在线播放免费| 97国产在线av精品| 日韩av免费观看一区| 男人天堂色男人av| heyzo蜜桃熟女人妻| 真实国产乱子伦一区二区| 2022国产精品视频| 国产精品久久久久网| 日韩精品激情在线观看| 国产欧美精品免费观看视频| 97小视频人妻一区二区| 亚洲av黄色在线网站| av新中文天堂在线网址| 男生舔女生逼逼的视频| 早川濑里奈av黑人番号| 在线观看日韩激情视频| 一区二区三区日韩久久| 色av色婷婷人妻久久久精品高清| 免费看美女脱光衣服的视频| 国产成人小视频在线观看无遮挡| 粉嫩欧美美人妻小视频| 搡老熟女一区二区在线观看| 成人亚洲国产综合精品| 亚洲欧美人精品高清| 亚洲一区二区久久久人妻| 国产高清97在线观看视频| 男生舔女生逼逼视频| 亚洲天堂成人在线观看视频网站| 77久久久久国产精产品| 中文字幕日韩精品日本| 国产在线自在拍91国语自产精品| av中文字幕福利网| 亚洲天堂第一页中文字幕| 青青草精品在线视频观看| 中文字幕人妻一区二区视频| 黄片三级三级三级在线观看| 偷青青国产精品青青在线观看| 亚洲精品高清自拍av| 韩国一级特黄大片做受| 99热久久极品热亚洲| 在线免费观看99视频| 在线观看操大逼视频| 日韩欧美制服诱惑一区在线| 男人靠女人的逼视频| 欧美专区第八页一区在线播放| 98视频精品在线观看| 久久这里只有精品热视频| 国产黄色大片在线免费播放| 久久精品在线观看一区二区| 老司机在线精品福利视频| huangse网站在线观看| 动漫精品视频在线观看| 91成人在线观看免费视频| 激情五月婷婷免费视频| 好吊视频—区二区三区| 日本女人一级免费片| 国产精品视频男人的天堂| 精品老妇女久久9g国产| 1000部国产精品成人观看视频| 国产变态另类在线观看| 欧美一级视频一区二区| 最新黄色av网站在线观看| 在线观看视频网站麻豆| 538精品在线观看视频| 成熟丰满熟妇高潮xx×xx| 亚洲高清国产拍青青草原| 欧美成人猛片aaaaaaa| 欧洲精品第一页欧洲精品亚洲| 国产av欧美精品高潮网站| 午夜在线观看一区视频| 日韩欧美国产精品91| 少妇露脸深喉口爆吞精| av中文字幕福利网| 日本人妻精品久久久久久| 精品国产污污免费网站入口自| 久草电影免费在线观看| 国产精彩对白一区二区三区| 91国产资源在线视频| 超级av免费观看一区二区三区| 国产女人叫床高潮大片视频| 男人和女人激情视频| 欧美一级视频一区二区| 中文字幕第一页国产在线| 午夜免费观看精品视频| 日本一区二区三区免费小视频 | 亚洲av自拍偷拍综合| 国产精品成久久久久三级蜜臀av| 人妻最新视频在线免费观看| 日韩av有码一区二区三区4 | 国产精品自拍偷拍a| 中国老熟女偷拍第一页| 欧美第一页在线免费观看视频| 77久久久久国产精产品| 在线观看视频 你懂的| 亚洲2021av天堂| 51国产偷自视频在线播放| 国产精品久久9999| 国产精品国产三级国产精东| 中文字幕av熟女人妻| 国产成人精品一区在线观看| 日本在线一区二区不卡视频| 福利午夜视频在线观看| 国产av自拍偷拍盛宴| 国产一区二区三免费视频| 欧美一区二区三区久久久aaa| 偷拍自拍福利视频在线观看| 经典av尤物一区二区| 日本三极片视频网站观看| 超污视频在线观看污污污| 中文字幕高清资源站| 国产在线免费观看成人| 成人性黑人一级av| 57pao国产一区二区| 婷婷六月天中文字幕| 98精产国品一二三产区区别| 老司机午夜精品视频资源| 人妻丝袜诱惑我操她视频| 又色又爽又黄又刺激av网站| 天天干天天操天天爽天天摸| 99re6热在线精品| 亚洲一区二区久久久人妻| 国产1区,2区,3区| 精品乱子伦一区二区三区免费播 | 国产麻豆剧传媒精品国产av蜜桃| 2012中文字幕在线高清| 一区二区三区 自拍偷拍| 亚洲在线观看中文字幕av| 福利国产视频在线观看| 亚洲一区自拍高清免费视频| 护士特殊服务久久久久久久| 超碰97人人澡人人| 韩国亚洲欧美超一级在线播放视频| 国产视频网站国产视频| 日韩美女福利视频网| 亚洲 中文 自拍 无码| 韩国三级aaaaa高清视频 | 国产污污污污网站在线| 91人妻人人做人人爽在线| 亚国产成人精品久久久| 97人妻人人澡爽人人精品| japanese日本熟妇另类| 97少妇精品在线观看| 2020av天堂网在线观看| 午夜久久久久久久精品熟女| lutube在线成人免费看 | 亚洲图片偷拍自拍区| 成人国产小视频在线观看| 人妻av无码专区久久绿巨人| 美女操逼免费短视频下载链接| 熟女在线视频一区二区三区| 最新中文字幕免费视频| 日本一二三中文字幕| 老有所依在线观看完整版| 57pao国产一区二区| 一区国内二区日韩三区欧美| 欧美成人精品在线观看| 91亚洲精品干熟女蜜桃频道| 久久久麻豆精亚洲av麻花| 亚洲推理片免费看网站| 人妻自拍视频中国大陆| 精品美女久久久久久| 日韩熟女系列一区二区三区| 日本真人性生活视频免费看| 无套猛戳丰满少妇人妻| 一区二区三区日本伦理| 久久久久久久久久一区二区三区 | av久久精品北条麻妃av观看| 日本www中文字幕| 在线免费观看视频一二区| 亚洲 清纯 国产com| 欧美成人精品在线观看| 成人久久精品一区二区三区| 欧美熟妇一区二区三区仙踪林| 人妻久久久精品69系列| 日本免费午夜视频网站| 91人妻精品一区二区在线看| 初美沙希中文字幕在线| 18禁无翼鸟成人在线| 日本成人一区二区不卡免费在线| 久久综合老鸭窝色综合久久| 国产精选一区在线播放| 夜色福利视频在线观看| 青青草亚洲国产精品视频| 美日韩在线视频免费看| 97青青青手机在线视频| 天天干狠狠干天天操| 国产91久久精品一区二区字幕| 快插进小逼里大鸡吧视频| 又粗又硬又猛又爽又黄的| 免费高清自慰一区二区三区网站 | 99精品免费久久久久久久久a| 亚洲av天堂在线播放| 大屁股熟女一区二区三区| 老司机在线精品福利视频| 亚洲成人黄色一区二区三区| 人人妻人人爽人人澡人人精品| 日韩近亲视频在线观看| av黄色成人在线观看| 亚洲熟妇无码一区二区三区| 精品视频国产在线观看| 在线观看免费岛国av| 欧美xxx成人在线| 在线免费观看视频一二区| 精品国产亚洲av一淫| 亚洲av午夜免费观看| 色伦色伦777国产精品| 天天综合天天综合天天网| 青草久久视频在线观看| 成人精品在线观看视频| 欧美天堂av无线av欧美| 午夜福利资源综合激情午夜福利资| 国产chinesehd精品麻豆| 亚洲国产免费av一区二区三区 | 狠狠躁夜夜躁人人爽天天天天97| 午夜福利人人妻人人澡人人爽| 欲乱人妻少妇在线视频裸| 亚洲综合图片20p| 国产精品精品精品999| 91福利视频免费在线观看| 亚洲熟女女同志女同| 无码中文字幕波多野不卡| 蜜臀av久久久久久久| 亚洲狠狠婷婷综合久久app| 老司机你懂得福利视频| 日视频免费在线观看| 东游记中文字幕版哪里可以看到| 在线播放国产黄色av| 国产精品自拍偷拍a| 中文字幕高清在线免费播放 | 亚洲人一区二区中文字幕| 国产成人无码精品久久久电影| nagger可以指黑人吗| 久久精品在线观看一区二区| 日本熟妇色熟妇在线观看| 2021久久免费视频| 国产美女午夜福利久久| 精品黑人一区二区三区久久国产| 性欧美激情久久久久久久| 五十路熟女av天堂| 人妻丝袜榨强中文字幕| 亚洲av在线观看尤物| 欧美日本在线观看一区二区| av久久精品北条麻妃av观看| 欧美在线一二三视频| 国产成人自拍视频在线免费观看| 精内国产乱码久久久久久| 自拍偷拍亚洲精品第2页| weyvv5国产成人精品的视频| 2021国产一区二区| av视屏免费在线播放| 在线观看日韩激情视频| 亚洲精品在线资源站| 桃色视频在线观看一区二区| 美女吃鸡巴操逼高潮视频| 久久这里只有精彩视频免费| 国产精品中文av在线播放| 97精品人妻一区二区三区精品| 青青青aaaa免费| 91国产在线视频免费观看| 亚洲专区激情在线观看视频| www日韩毛片av| 在线国产精品一区二区三区| www骚国产精品视频| 免费看高清av的网站| 亚洲卡1卡2卡三卡四老狼| 久久久久久国产精品| 国产刺激激情美女网站| 成人久久精品一区二区三区| av日韩在线观看大全| 中文字幕日韩91人妻在线| 日本高清成人一区二区三区| 18禁精品网站久久| 中文字幕在线观看极品视频| 黄片三级三级三级在线观看| 淫秽激情视频免费观看| 一色桃子久久精品亚洲| 欧洲国产成人精品91铁牛tv| 婷婷色国产黑丝少妇勾搭AV| 激情图片日韩欧美人妻| 天堂女人av一区二区| 久久久久久性虐视频| 亚洲天堂精品福利成人av| 绯色av蜜臀vs少妇| 亚洲在线观看中文字幕av| 精品av久久久久久久| 福利在线视频网址导航| 青青草人人妻人人妻| 二区中出在线观看老师| 亚洲一区二区三区精品乱码| 又粗又硬又猛又爽又黄的| 亚洲另类在线免费观看| 绝顶痉挛大潮喷高潮无码| 自拍偷拍,中文字幕| 中文字幕av男人天堂| 2019av在线视频| 亚洲人妻国产精品综合| 午夜精彩视频免费一区| 黑人巨大的吊bdsm| 日韩不卡中文在线视频网站| 国产超码片内射在线| 丝袜长腿第一页在线| 狠狠操操操操操操操操操| 在线观看免费视频色97| 果冻传媒av一区二区三区| 午夜福利资源综合激情午夜福利资 | 91免费福利网91麻豆国产精品| 桃色视频在线观看一区二区| 18禁美女无遮挡免费| 中文字母永久播放1区2区3区| 日韩欧美国产一区不卡| 色综合久久五月色婷婷综合| 狠狠的往里顶撞h百合| 欧美aa一级一区三区四区| 在线观看免费岛国av| 成人精品视频99第一页| 97黄网站在线观看| 青青草在观免费国产精品| 91 亚洲视频在线观看| 国产一区成人在线观看视频| 91国产资源在线视频| 不戴胸罩引我诱的隔壁的人妻| 亚欧在线视频你懂的| 黄色无码鸡吧操逼视频| 一区二区三区四区中文| 免费手机黄页网址大全| 国产黄色大片在线免费播放| 中文字幕一区二区自拍| 亚洲 清纯 国产com| 伊人综合aⅴ在线网| 国产变态另类在线观看| 亚洲护士一区二区三区| 美女av色播在线播放| 天天躁日日躁狠狠躁躁欧美av | 亚洲中文精品字幕在线观看| 在线观看免费视频色97| 3D动漫精品啪啪一区二区下载 | 超碰97人人做人人爱| 国内精品在线播放第一页| 欧美80老妇人性视频| 2020久久躁狠狠躁夜夜躁| 99的爱精品免费视频| 中文字幕高清在线免费播放 | 99久久99一区二区三区| 日本高清撒尿pissing| 在线不卡成人黄色精品| 日韩av大胆在线观看| 亚洲一级特黄特黄黄色录像片| 午夜免费体验区在线观看| 中文 成人 在线 视频| 日本人妻精品久久久久久| 欧美精品黑人性xxxx| 日本熟妇喷水xxx| 亚洲另类综合一区小说| 亚洲成人激情视频免费观看了| 粉嫩小穴流水视频在线观看| 午夜精彩视频免费一区| 日比视频老公慢点好舒服啊| 欧亚日韩一区二区三区观看视频| 日韩欧美在线观看不卡一区二区| 亚洲成人国产综合一区| av破解版在线观看| 久久久91蜜桃精品ad| 中文字母永久播放1区2区3区| 99一区二区在线观看| 亚洲少妇人妻无码精品| 深田咏美亚洲一区二区| 丝袜肉丝一区二区三区四区在线看| 久碰精品少妇中文字幕av| 久久久久久久99精品| 中文字幕国产专区欧美激情| 特一级特级黄色网片| 狠狠操操操操操操操操操| 91人妻精品久久久久久久网站| 91av精品视频在线| 激情小视频国产在线| 亚洲特黄aaaa片| 久久亚洲天堂中文对白| av亚洲中文天堂字幕网| 中文字幕一区二区三区蜜月| 国产在线一区二区三区麻酥酥| 国产成人精品午夜福利训2021| 女警官打开双腿沦为性奴| 91精品国产麻豆国产| 色综合久久久久久久久中文| 老司机福利精品免费视频一区二区| 精品亚洲在线免费观看| 2025年人妻中文字幕乱码在线| 黄色中文字幕在线播放| 日韩特级黄片高清在线看| 激情综合治理六月婷婷| 深夜男人福利在线观看| 国产成人精品午夜福利训2021| 青娱乐蜜桃臀av色| av一区二区三区人妻| 操人妻嗷嗷叫视频一区二区| 阴茎插到阴道里面的视频| 亚洲专区激情在线观看视频| 亚洲国产香蕉视频在线播放| 中文字幕高清在线免费播放| 丝袜长腿第一页在线| 人妻久久久精品69系列| 亚洲精品无码色午夜福利理论片| 国产熟妇一区二区三区av| 亚洲 清纯 国产com| 97欧洲一区二区精品免费| 2017亚洲男人天堂| 清纯美女在线观看国产| 亚洲国产美女一区二区三区软件| 国产三级片久久久久久久| 欧美天堂av无线av欧美| 久久久久久久久久久久久97| 久久国产精品精品美女| 亚洲在线观看中文字幕av| 五月天中文字幕内射| 沈阳熟妇28厘米大战黑人| 成人网18免费视频版国产| 国产一区二区视频观看| 亚洲av琪琪男人的天堂| 天天艹天天干天天操| 在线观看一区二区三级| 人妻丝袜av在线播放网址| okirakuhuhu在线观看| 美女操逼免费短视频下载链接| 中文字幕高清免费在线人妻| 人妻凌辱欧美丰满熟妇| 80电影天堂网官网| 啊啊啊视频试看人妻| 抽查舔水白紧大视频| 日韩av有码中文字幕| 色婷婷精品大在线观看| 国产一区二区在线欧美| 亚洲精品久久视频婷婷| 国产一区二区视频观看| 欧美视频综合第一页| 国产成人精品一区在线观看| 啪啪啪操人视频在线播放| 国产午夜男女爽爽爽爽爽视频| 韩国一级特黄大片做受| 少妇ww搡性bbb91| 中文字幕网站你懂的| 欧美日韩亚洲国产无线码| 大陆av手机在线观看| 大鸡巴操b视频在线| 亚洲福利天堂久久久久久| 国产精品久久久久久久精品视频| 又粗又硬又猛又黄免费30| 美女日逼视频免费观看| 搞黄色在线免费观看| 亚洲在线一区二区欧美| 亚洲av自拍偷拍综合| 黄色资源视频网站日韩| 亚洲 中文 自拍 另类 欧美| 中文字幕中文字幕人妻| 亚洲午夜福利中文乱码字幕| 91精品国产高清自在线看香蕉网 | 亚洲av无码成人精品区辽| 亚洲福利精品视频在线免费观看| 国产久久久精品毛片| 在线视频免费观看网| 日本熟女50视频免费| 一色桃子久久精品亚洲| 国产美女一区在线观看| www日韩毛片av| 自拍偷拍日韩欧美一区二区| 国产97在线视频观看| 天天通天天透天天插| 欧美成人综合视频一区二区| av乱码一区二区三区| 五月婷婷在线观看视频免费| 91精品国产91青青碰| 老司机免费福利视频网| 视频在线亚洲一区二区| 精品国产污污免费网站入口自| 超碰在线中文字幕一区二区| 国产成人精品福利短视频| 欧美精产国品一二三产品价格| 99精品亚洲av无码国产另类| 国产又粗又硬又大视频| 日本人妻少妇18—xx| av天堂资源最新版在线看| 国产无遮挡裸体免费直播视频| 欧美一区二区三区四区性视频| 人妻凌辱欧美丰满熟妇| 春色激情网欧美成人| 精品一线二线三线日本| 老司机午夜精品视频资源| 九色porny九色9l自拍视频| 日本乱人一区二区三区| 亚洲av无码成人精品区辽| 91传媒一区二区三区| 中文字幕亚洲中文字幕| 欧美成人猛片aaaaaaa| 亚洲色偷偷综合亚洲AV伊人| 三级等保密码要求条款| av天堂中文免费在线| 91精品国产高清自在线看香蕉网 | 黑人变态深video特大巨大| 91p0rny九色露脸熟女| 亚洲av色图18p| av久久精品北条麻妃av观看| 日韩av大胆在线观看| 精品国产午夜视频一区二区| 香蕉91一区二区三区| 欧美日韩一区二区电影在线观看| 女同互舔一区二区三区| 中文字幕日韩精品就在这里| 成年人午夜黄片视频资源| 2021天天色天天干| 欧美黑人巨大性xxxxx猛交| 啊啊好大好爽啊啊操我啊啊视频 | 亚洲 中文字幕在线 日韩| 国产大鸡巴大鸡巴操小骚逼小骚逼| 国产福利在线视频一区| 久久精品视频一区二区三区四区| 日韩亚洲高清在线观看| 天天操天天插天天色| 福利国产视频在线观看| 综合色区亚洲熟妇shxstz| 淫秽激情视频免费观看| 扒开让我视频在线观看| 久久精品36亚洲精品束缚| 午夜免费观看精品视频| 沈阳熟妇28厘米大战黑人| 欧美日韩一区二区电影在线观看| av亚洲中文天堂字幕网| 国内自拍第一页在线观看| 在线免费91激情四射| 日韩中文字幕福利av| 国产91嫩草久久成人在线视频| 成人动漫大肉棒插进去视频| 果冻传媒av一区二区三区| 三级等保密码要求条款| 色噜噜噜噜18禁止观看| 亚洲av香蕉一区区二区三区犇| 久久久久久久久久一区二区三区| 2021久久免费视频| 97人妻夜夜爽二区欧美极品| 日韩一个色综合导航| 夜女神免费福利视频| 欧美黄片精彩在线免费观看| 丝袜亚洲另类欧美变态| 大鸡巴后入爆操大屁股美女| 人妻少妇一区二区三区蜜桃| 中国老熟女偷拍第一页| 一本久久精品一区二区| 欧美viboss性丰满| 亚洲av极品精品在线观看| 人妻少妇亚洲一区二区| 亚洲图片欧美校园春色| 亚洲熟女综合色一区二区三区四区| 懂色av之国产精品| 亚洲国产中文字幕啊啊啊不行了 | 岳太深了紧紧的中文字幕| 亚洲欧美一区二区三区电影| 中文字幕熟女人妻久久久| 中文字幕无码日韩专区免费| 女同性ⅹxx女同hd| 天天操天天干天天日狠狠插| 亚洲av极品精品在线观看| 91成人在线观看免费视频| 少妇高潮一区二区三区| 亚洲综合另类精品小说| 蜜臀av久久久久蜜臀av麻豆| 成年人的在线免费视频| 99久久中文字幕一本人| 欧美激情电影免费在线| av中文字幕福利网| 欧美综合婷婷欧美综合| 国产精品福利小视频a| 偷拍美女一区二区三区| 免费在线黄色观看网站| 粉嫩小穴流水视频在线观看| 国产亚洲精品品视频在线| 狠狠嗨日韩综合久久| 中文字母永久播放1区2区3区 | av日韩在线观看大全| 18禁美女黄网站色大片下载| 东京干手机福利视频| 一级A一级a爰片免费免会员| 欧美视频不卡一区四区| 欧美成人精品在线观看| 91久久精品色伊人6882| 天天射夜夜操综合网| 欧美精品一区二区三区xxxx| 亚洲av色香蕉一区二区三区| 日韩欧美在线观看不卡一区二区| 亚洲一区二区人妻av| 国产熟妇乱妇熟色T区| 91久久国产成人免费网站| 日本av熟女在线视频| 经典av尤物一区二区| 亚洲最大黄了色网站| 欧美精产国品一二三产品价格| 日本午夜爽爽爽爽爽视频在线观看| 国产精品黄片免费在线观看| 在线观看免费视频网| 日韩av熟妇在线观看| 桃色视频在线观看一区二区 | 亚洲成av人无码不卡影片一| 99人妻视频免费在线| 亚洲成av人无码不卡影片一| 亚洲蜜臀av一区二区三区九色| 宅男噜噜噜666国产| 综合一区二区三区蜜臀| 久久丁香花五月天色婷婷| 天天日天天添天天爽| 精品视频中文字幕在线播放| 姐姐的朋友2在线观看中文字幕| 精彩视频99免费在线| 青青草原网站在线观看| 91麻豆精品91久久久久同性| 91精品资源免费观看| 97资源人妻免费在线视频| 99国产精品窥熟女精品| 精品一区二区三区三区88| www日韩毛片av| 亚洲天堂有码中文字幕视频| 国产精品免费不卡av| 国产露脸对白在线观看| 久久久久久国产精品| 国产白嫩美女一区二区| 男人和女人激情视频| 最近中文字幕国产在线| 国产老熟女伦老熟妇ⅹ| av手机在线观播放网站| 日韩欧美中文国产在线 | 天天日天天鲁天天操| tube69日本少妇| 国产熟妇一区二区三区av | 小泽玛利亚视频在线观看| 天天日天天干天天插舔舔| 三级黄色亚洲成人av| 久青青草视频手机在线免费观看| 香蕉av影视在线观看| 精品一区二区三区在线观看| 亚洲精品精品国产综合| 19一区二区三区在线播放| 香蕉aⅴ一区二区三区| 亚洲一级 片内射视正片| 成人精品视频99第一页| 夜色17s精品人妻熟女| 一级a看免费观看网站| 美女操逼免费短视频下载链接 | 少妇人妻久久久久视频黄片| 日本精品视频不卡一二三| 丰满熟女午夜福利视频| 午夜美女少妇福利视频| 久久久久国产成人精品亚洲午夜| 午夜精品一区二区三区城中村| 夏目彩春在线中文字幕| 欧美精品一区二区三区xxxx| 韩国一级特黄大片做受| 一区二区三区激情在线| 激情国产小视频在线| 9国产精品久久久久老师| 中文字幕在线一区精品| 一区二区三区蜜臀在线| 日本女大学生的黄色小视频| 中文 成人 在线 视频| 天天艹天天干天天操| 天天日天天鲁天天操| 57pao国产一区二区| av天堂资源最新版在线看| 欧美中文字幕一区最新网址| 玖玖一区二区在线观看| 国产午夜福利av导航| 91啪国自产中文字幕在线| 欧美专区第八页一区在线播放| 丝袜亚洲另类欧美变态| 福利午夜视频在线观看| 成人精品视频99第一页| 亚洲免费va在线播放| 婷婷色中文亚洲网68| 久草视频首页在线观看| 免费观看成年人视频在线观看| jiujiure精品视频在线| 亚洲狠狠婷婷综合久久app | 护士小嫩嫩又紧又爽20p| 黄色片黄色片wyaa| 国产精品久久久久网| 一区二区三区欧美日韩高清播放| 亚洲美女美妇久久字幕组| 国内精品在线播放第一页| 日本av熟女在线视频| 色花堂在线av中文字幕九九| 国产成人精品福利短视频| 午夜精彩视频免费一区| 韩国亚洲欧美超一级在线播放视频| 99人妻视频免费在线| 激情人妻校园春色亚洲欧美| 青青尤物在线观看视频网站| 免费福利av在线一区二区三区| 一区二区三区四区视频在线播放| 大香蕉大香蕉大香蕉大香蕉大香蕉 | 亚洲高清视频在线不卡| 亚洲1069综合男同| 91老熟女连续高潮对白| 不卡日韩av在线观看| 都市家庭人妻激情自拍视频| 国产精品人妻熟女毛片av久| 91福利在线视频免费观看| 天天干天天操天天玩天天射| 午夜蜜桃一区二区三区| 2020av天堂网在线观看| 中文字幕1卡1区2区3区| 国产美女精品福利在线| 2022国产精品视频| 成人影片高清在线观看 | 超碰97人人澡人人| 日本少妇人妻xxxxx18| 欧美日韩一区二区电影在线观看| 亚洲中文字幕乱码区| 激情国产小视频在线| 97超碰最新免费在线观看| 国产麻豆乱子伦午夜视频观看| 欧洲亚洲欧美日韩综合| 日韩影片一区二区三区不卡免费| 人人妻人人人操人人人爽| 91免费福利网91麻豆国产精品 | 亚洲综合色在线免费观看| 在线免费91激情四射 | 免费av岛国天堂网站| av一区二区三区人妻| 午夜毛片不卡在线看| 国产一区二区三免费视频| 日本黄色三级高清视频| 手机看片福利盒子日韩在线播放| 一区二区三区激情在线| 久久久人妻一区二区| 自拍偷区二区三区麻豆| 日本后入视频在线观看| 青青伊人一精品视频| 亚洲 欧美 精品 激情 偷拍| 亚洲av在线观看尤物| av中文字幕在线导航| 青青草亚洲国产精品视频| 中文字幕高清免费在线人妻| 啊啊好大好爽啊啊操我啊啊视频| 国产精品午夜国产小视频| 岛国黄色大片在线观看| 97超碰免费在线视频| 欧美老鸡巴日小嫩逼| 任我爽精品视频在线播放| 欧美久久一区二区伊人| 人人妻人人爽人人添夜| 青青青国产免费视频| 亚洲国产免费av一区二区三区| 人妻少妇性色欲欧美日韩| 国产福利小视频二区| 高潮喷水在线视频观看| 中国把吊插入阴蒂的视频| 粉嫩欧美美人妻小视频| 51精品视频免费在线观看| 青草亚洲视频在线观看| 亚洲人妻视频在线网| 色呦呦视频在线观看视频| 欧美日韩国产一区二区三区三州 | 国产精品欧美日韩区二区| 欧美成人猛片aaaaaaa| 亚洲一区二区三区在线高清| 日韩欧美在线观看不卡一区二区| aaa久久久久久久久| av资源中文字幕在线观看| 美女视频福利免费看| 大香蕉玖玖一区2区| 国产黄色a级三级三级三级| 亚洲另类在线免费观看| 少妇人妻久久久久视频黄片| 自拍偷拍日韩欧美一区二区| 亚洲的电影一区二区三区| 国产一区二区三免费视频| 中文字幕在线一区精品| 亚洲一区二区激情在线| 婷婷午夜国产精品久久久| 日本三极片视频网站观看| 曰本无码人妻丰满熟妇啪啪| 欧美一级色视频美日韩| av老司机亚洲一区二区| 亚洲少妇人妻无码精品| 综合激情网激情五月五月婷婷| 国产福利小视频免费观看| www久久久久久久久久久| 一色桃子人妻一区二区三区| 91国内视频在线观看| 端庄人妻堕落挣扎沉沦| 日曰摸日日碰夜夜爽歪歪| 91一区精品在线观看| 久久精品久久精品亚洲人| 亚洲一级美女啪啪啪| 99国内小视频在现欢看| 在线观看国产网站资源| 久久国产精品精品美女| 国产黄色a级三级三级三级| 中文字幕日韩精品就在这里| 国产精品久久久久久久女人18| 不戴胸罩引我诱的隔壁的人妻| 亚洲av日韩av第一区二区三区| 欧美 亚洲 另类综合| 成人免费公开视频无毒| 日本午夜爽爽爽爽爽视频在线观看| 欧美黄片精彩在线免费观看| 99国内小视频在现欢看| www天堂在线久久| 在线新三级黄伊人网| 激情五月婷婷免费视频| 99精品国产免费久久| 久草极品美女视频在线观看| 国产va精品免费观看 | 亚洲精品亚洲人成在线导航| 国产白嫩美女一区二区| 日韩人妻在线视频免费| av天堂中文字幕最新| 日本熟妇丰满厨房55| 日曰摸日日碰夜夜爽歪歪| av一本二本在线观看| 日本一区二区三区免费小视频| 亚洲午夜电影在线观看| 成年人黄色片免费网站| 一区二区视频在线观看免费观看| 国产97在线视频观看| 春色激情网欧美成人| 蜜桃色婷婷久久久福利在线| 91chinese在线视频| v888av在线观看视频| 美女小视频网站在线| 护士特殊服务久久久久久久| 黄色视频成年人免费观看| 日本精品一区二区三区在线视频。 | 国产精品熟女久久久久浪潮| 成熟熟女国产精品一区| 午夜的视频在线观看| 亚洲精品国产久久久久久| 韩国一级特黄大片做受| 一区二区三区蜜臀在线| 阴茎插到阴道里面的视频| 91国语爽死我了不卡| 亚洲av无硬久久精品蜜桃| 日韩人妻丝袜中文字幕| 天天摸天天日天天操| 午夜精品九一唐人麻豆嫩草成人| 亚洲欧美清纯唯美另类| 欧美成人小视频在线免费看| 孕妇奶水仑乱A级毛片免费看| 亚洲护士一区二区三区| 丰满的子国产在线观看| 国产精品中文av在线播放| 五十路老熟女码av| 伊人开心婷婷国产av| 五十路息与子猛烈交尾视频| 大香蕉大香蕉大香蕉大香蕉大香蕉| 农村胖女人操逼视频| 国产福利小视频免费观看| 国产精品午夜国产小视频| 亚洲欧美清纯唯美另类 | 天天射夜夜操狠狠干| 人妻丰满熟妇综合网| av在线观看网址av| 被大鸡吧操的好舒服视频免费 | 欧洲日韩亚洲一区二区三区| 黑人巨大精品欧美视频| 二区中出在线观看老师| 午夜福利资源综合激情午夜福利资 | av俺也去在线播放| 亚洲高清国产自产av| 视频一区 视频二区 视频| 亚洲国产香蕉视频在线播放| 极品丝袜一区二区三区| 国产精品黄页网站视频| 91精品视频在线观看免费| 欧美在线一二三视频| 黄色大片男人操女人逼| 不戴胸罩引我诱的隔壁的人妻| 国产精品久久久久久久久福交| 揄拍成人国产精品免费看视频| 亚洲最大免费在线观看| 无码中文字幕波多野不卡| 99久久中文字幕一本人| 国产免费高清视频视频| 国产乱弄免费视频观看| 天天干天天操天天插天天日| 日韩三级电影华丽的外出| 天天日天天敢天天干| 在线免费观看日本片| 一区二区三区麻豆福利视频| 性感美女高潮视频久久久| 免费在线观看污污视频网站| 亚洲公开视频在线观看| 欧美精品国产综合久久| 日本在线不卡免费视频| 在线免费观看视频一二区| 香港三日本三韩国三欧美三级| 天天日天天舔天天射进去| 欧美一级色视频美日韩| 国产一区二区视频观看| 人妻无码色噜噜狠狠狠狠色| nagger可以指黑人吗| 亚洲熟妇x久久av久久| 韩国AV无码不卡在线播放| 嫩草aⅴ一区二区三区| 日本少妇精品免费视频| 亚洲成人激情av在线| 国产一区二区久久久裸臀| 在线视频这里只有精品自拍| 欧美黄片精彩在线免费观看| 免费十精品十国产网站| 老司机午夜精品视频资源| 国产亚洲四十路五十路| 人妻少妇精品久久久久久| 一色桃子人妻一区二区三区| 欧美精品黑人性xxxx| 国产91久久精品一区二区字幕| 爱爱免费在线观看视频| 中文字幕人妻被公上司喝醉在线| 少妇ww搡性bbb91| 91国偷自产一区二区三区精品| 成年人午夜黄片视频资源| 一区二区三区在线视频福利| 黑人变态深video特大巨大| 视频一区 二区 三区 综合| 国产美女午夜福利久久| 亚洲免费国产在线日韩| 国产V亚洲V天堂无码欠欠| 91麻豆精品传媒国产黄色片| 国产免费高清视频视频| 黑人借宿ntr人妻的沦陷2| 大鸡八强奸视频在线观看| 特一级特级黄色网片| 岛国av高清在线成人在线| 午夜精品福利91av| av俺也去在线播放| 77久久久久国产精产品| 一区二区三区四区五区性感视频| 天天操,天天干,天天射| 性感美女福利视频网站| aⅴ精产国品一二三产品| 久久热久久视频在线观看| 日本美女成人在线视频| 人妻少妇性色欲欧美日韩| 97国产在线av精品| 福利午夜视频在线观看| 欧美激情电影免费在线| 适合午夜一个人看的视频| 国产福利小视频免费观看| 婷婷久久一区二区字幕网址你懂得| 在线观看成人国产电影| 中文字幕av男人天堂| 日本五十路熟新垣里子| 清纯美女在线观看国产| 国产又粗又硬又猛的毛片视频| 精品一区二区三区欧美| 69精品视频一区二区在线观看| 国产精品精品精品999| 亚洲精品欧美日韩在线播放| 91国产在线视频免费观看| 一区二区久久成人网| 日韩北条麻妃一区在线| 国产va在线观看精品| 99热这里只有国产精品6| 视频一区 二区 三区 综合| 日韩欧美国产精品91| 亚洲精品国偷自产在线观看蜜桃| 1024久久国产精品| 日本一二三中文字幕| 国产一区成人在线观看视频| 91色秘乱一区二区三区| 亚洲精品国产综合久久久久久久久| 成年人该看的视频黄免费| 国产精品久久久久网| 九色精品视频在线播放| 亚洲图片偷拍自拍区| 非洲黑人一级特黄片| 亚洲国产精品久久久久蜜桃| 亚洲天堂成人在线观看视频网站| 超碰中文字幕免费观看| 深夜男人福利在线观看| 天美传媒mv视频在线观看| 午夜福利人人妻人人澡人人爽| 香蕉片在线观看av| av日韩在线观看大全| 国产妇女自拍区在线观看 | 中国黄片视频一区91| 宅男噜噜噜666免费观看| 19一区二区三区在线播放| 亚洲精品午夜aaa久久| 老司机福利精品免费视频一区二区| 日本韩国免费福利精品| 天堂v男人视频在线观看| 老司机免费视频网站在线看| 久久这里只有精彩视频免费| av黄色成人在线观看| 女生自摸在线观看一区二区三区| 久久这里只有精品热视频| 天天日天天鲁天天操| 亚洲Av无码国产综合色区| 免费福利av在线一区二区三区| 亚洲av无硬久久精品蜜桃| 98精产国品一二三产区区别| 亚洲一区二区三区久久午夜| 国产janese在线播放| 人妻最新视频在线免费观看| 中文字幕日本人妻中出| 亚洲 中文字幕在线 日韩| 国产91精品拍在线观看| 亚洲国产欧美一区二区三区久久| 欧美黑人巨大性xxxxx猛交| 曰本无码人妻丰满熟妇啪啪| 绝色少妇高潮3在线观看| 久久99久久99精品影院| 国产va精品免费观看| 欧美国品一二三产区区别| 日韩影片一区二区三区不卡免费| 日日夜夜大香蕉伊人| 国产精品人妻66p| 精品一线二线三线日本| 老师啊太大了啊啊啊尻视频| 一区二区在线观看少妇| 青青青青青免费视频| 欧美老妇精品另类不卡片| 2021最新热播中文字幕| 3344免费偷拍视频| 91精品国产91久久自产久强| 丰满熟女午夜福利视频| 青青青青视频在线播放| 日韩欧美中文国产在线| 91国内精品自线在拍白富美| 一区二区三区精品日本| 国产精品自拍偷拍a| 特级无码毛片免费视频播放| yellow在线播放av啊啊啊| 色综合久久五月色婷婷综合| 欧洲亚洲欧美日韩综合| 成人av亚洲一区二区| 日本丰满熟妇BBXBBXHD| 自拍偷拍一区二区三区图片| 好吊视频—区二区三区| 人人妻人人爱人人草| 亚洲自拍偷拍精品网| 亚洲综合一区成人在线| 美女视频福利免费看| 亚洲欧美清纯唯美另类| 91精品国产黑色丝袜| 久精品人妻一区二区三区| 丝袜美腿欧美另类 中文字幕| 欧美天堂av无线av欧美| 狠狠躁夜夜躁人人爽天天久天啪| 久草福利电影在线观看| 日本免费午夜视频网站| 国产黄色大片在线免费播放 | 亚洲精品中文字幕下载| av俺也去在线播放| 国产密臀av一区二区三| 91成人精品亚洲国产| 中文字母永久播放1区2区3区| 日本真人性生活视频免费看| 国产乱子伦精品视频潮优女| 国产精品午夜国产小视频| 午夜精品久久久久麻豆影视| 天天日天天干天天爱| 日韩少妇人妻精品无码专区| 女警官打开双腿沦为性奴| 热99re69精品8在线播放| 中国视频一区二区三区| 自拍偷拍日韩欧美亚洲| 亚洲va天堂va国产va久| 欧美专区第八页一区在线播放 | 青青操免费日综合视频观看| h国产小视频福利在线观看| 亚洲一区二区激情在线| 男人天堂最新地址av| 久久久久久久久久久免费女人| 亚洲成人精品女人久久久| 少妇一区二区三区久久久| 免费黄高清无码国产| 亚洲中文字字幕乱码| 91色网站免费在线观看| 人妻少妇中文有码精品| 狍和女人的王色毛片| 中文字幕综合一区二区| 91chinese在线视频| 91精品国产91久久自产久强| 精品老妇女久久9g国产| 一本久久精品一区二区| 中文字幕无码一区二区免费| 91天堂精品一区二区| 欧美激情电影免费在线| 神马午夜在线观看视频| 亚洲成人激情视频免费观看了 | 伊人情人综合成人久久网小说| 亚洲午夜精品小视频| 国产亚洲欧美45p| 91色网站免费在线观看| 亚洲国产欧美一区二区三区久久| 中文字幕AV在线免费看 | aaa久久久久久久久| 成人av天堂丝袜在线观看| 国产欧美日韩第三页| 日韩一区二区三区三州| 涩涩的视频在线观看视频| 黄色男人的天堂视频| 欧美交性又色又爽又黄麻豆| 5528327男人天堂| 女生自摸在线观看一区二区三区 | 色婷婷六月亚洲综合香蕉| 日韩人妻xxxxx| 国产视频网站一区二区三区| 五月天中文字幕内射| 天天色天天操天天舔| 亚洲高清国产自产av| 天天日天天舔天天射进去| 超碰97人人做人人爱| 成人影片高清在线观看 | 在线视频精品你懂的| 日本午夜福利免费视频| 亚洲 中文 自拍 另类 欧美| 国产精品精品精品999| 天堂av在线播放免费| 99热久久极品热亚洲| 男人天堂最新地址av| 男女之间激情网午夜在线| 欧美精品免费aaaaaa| 欲满人妻中文字幕在线| 精品高跟鞋丝袜一区二区| 91av中文视频在线| 天天日天天天天天天天天天天| 4个黑人操素人视频网站精品91| 亚洲欧美清纯唯美另类| 日韩av中文在线免费观看| h国产小视频福利在线观看| 欧美国品一二三产区区别| 国产亚洲精品视频合集| 熟女在线视频一区二区三区| 啪啪啪啪啪啪啪啪啪啪黄色| 99精品视频在线观看婷婷| 天天干天天操天天爽天天摸| 人妻少妇亚洲精品中文字幕| 亚洲精品 欧美日韩| 中文字幕成人日韩欧美| 国产不卡av在线免费| 成人动漫大肉棒插进去视频| 性欧美激情久久久久久久| 中文字幕一区二区自拍| 制丝袜业一区二区三区| 日本午夜爽爽爽爽爽视频在线观看 | 最近的中文字幕在线mv视频| 干逼又爽又黄又免费的视频| 夜夜骑夜夜操夜夜奸| 1769国产精品视频免费观看| 国产黄色片在线收看| 国产精品精品精品999| 国产高清精品一区二区三区| 亚洲av香蕉一区区二区三区犇| 亚洲成人情色电影在线观看| 国产精品视频资源在线播放| 欧美老妇精品另类不卡片| 午夜精品一区二区三区4| 亚洲男人让女人爽的视频| 一区二区三区久久久91| 国产精品视频资源在线播放| 亚洲区美熟妇久久久久| 色婷婷精品大在线观看| 特级欧美插插插插插bbbbb| 热思思国产99re| 视频在线亚洲一区二区| 超级福利视频在线观看| 免费人成黄页网站在线观看国产| 日日爽天天干夜夜操| 久久精品亚洲成在人线a| 国产a级毛久久久久精品| 国产久久久精品毛片| 大香蕉伊人国产在线| 北条麻妃av在线免费观看| 免费十精品十国产网站| 日韩不卡中文在线视频网站| 粉嫩欧美美人妻小视频| 一区二区三区四区五区性感视频| 九色porny九色9l自拍视频| 99久久超碰人妻国产| 日本阿v视频在线免费观看| 中文字幕av熟女人妻| 在线免费观看欧美小视频| 一区二区三区另类在线| 中文字幕av一区在线观看| 国产亚洲国产av网站在线| 一区二区三区欧美日韩高清播放| 美女小视频网站在线| 亚洲高清国产一区二区三区| 日本黄色特一级视频| 精品高潮呻吟久久av| 亚洲va天堂va国产va久| 日韩精品激情在线观看| 天天干天天操天天摸天天射| 国产福利小视频二区| 午夜精品九一唐人麻豆嫩草成人| 人妻熟女在线一区二区| 亚洲熟女久久久36d| 亚洲一区二区三区av网站| 北条麻妃高跟丝袜啪啪| 国产乱子伦一二三区| 国产综合视频在线看片| 欧美久久久久久三级网| 激情人妻校园春色亚洲欧美| 国产普通话插插视频| 中国视频一区二区三区| 福利午夜视频在线合集| 亚洲中文字幕乱码区| 国产亚洲四十路五十路| 少妇与子乱在线观看| 哥哥姐姐综合激情小说| 亚洲推理片免费看网站| 自拍偷区二区三区麻豆| ka0ri在线视频| 中文乱理伦片在线观看| 77久久久久国产精产品| 中国把吊插入阴蒂的视频| 东游记中文字幕版哪里可以看到| 一区二区三区国产精选在线播放| 一区二区在线视频中文字幕 | 亚洲推理片免费看网站| 婷婷综合蜜桃av在线| 人妻素人精油按摩中出| 日韩人妻xxxxx| 五月天色婷婷在线观看视频免费| 亚洲精品av在线观看| 99久久99久国产黄毛片| 综合国产成人在线观看| 亚洲欧美国产综合777| 亚洲粉嫩av一区二区三区| 插逼视频双插洞国产操逼插洞| 欧美日韩在线精品一区二区三| 欧美精产国品一二三区| 国产视频精品资源网站| 亚洲护士一区二区三区| 免费高清自慰一区二区三区网站| 欧美日韩熟女一区二区三区| 午夜在线观看一区视频| 国产一级精品综合av| 国产妇女自拍区在线观看| 91精品视频在线观看免费| 欧美乱妇无乱码一区二区| 在线国产中文字幕视频| 亚洲国产香蕉视频在线播放| 日本性感美女写真视频| 亚洲精品 欧美日韩| 综合激情网激情五月五月婷婷| 欧美精品资源在线观看| 午夜激情高清在线观看| 激情综合治理六月婷婷| 在线观看免费岛国av| 国产日本精品久久久久久久| av俺也去在线播放| 夜色撩人久久7777| 日本女大学生的黄色小视频| 91福利在线视频免费观看| 欧美偷拍亚洲一区二区| 色av色婷婷人妻久久久精品高清 | jiujiure精品视频在线| 偷拍自拍 中文字幕| 国产卡一卡二卡三乱码手机| 91色网站免费在线观看| 人人妻人人人操人人人爽| 国产精品3p和黑人大战| 国产成人精品一区在线观看| 激情国产小视频在线| 男人在床上插女人视频| 国产精品人妻66p| 91人妻精品久久久久久久网站| 一级黄色av在线观看| 国产老熟女伦老熟妇ⅹ| 91精品国产黑色丝袜| 久久三久久三久久三久久| 大黑人性xxxxbbbb| 91亚洲国产成人精品性色| 天天操天天干天天日狠狠插| 女人精品内射国产99| 美女 午夜 在线视频| 久久久久久性虐视频| 91精品国产黑色丝袜| 欧美少妇性一区二区三区| 操日韩美女视频在线免费看| 91在线免费观看成人| 三级黄色亚洲成人av| 熟女俱乐部一二三区| 国产麻豆乱子伦午夜视频观看| 人人人妻人人澡人人| 天堂av中文在线最新版| 亚洲国际青青操综合网站| 日本熟妇色熟妇在线观看| 成人高潮aa毛片免费| 又粗又硬又猛又爽又黄的| 国产老熟女伦老熟妇ⅹ| 综合国产成人在线观看| 天天日天天爽天天爽| 国产欧美精品一区二区高清 | 国产高清精品一区二区三区| gogo国模私拍视频| 青青青aaaa免费| 日本女大学生的黄色小视频| 国产成人精品一区在线观看 | 综合精品久久久久97| 欧美亚洲国产成人免费在线| 久久久制服丝袜中文字幕| 顶级尤物粉嫩小尤物网站| 天天操夜夜操天天操天天操| 亚国产成人精品久久久| 欧美亚洲少妇福利视频| 精品久久久久久久久久久久人妻| 福利一二三在线视频观看| 天天躁日日躁狠狠躁躁欧美av| 国产普通话插插视频| 亚洲欧美综合在线探花| 免费观看国产综合视频| 日韩中文字幕精品淫| 韩国三级aaaaa高清视频 | 在线国产日韩欧美视频| 亚洲成人国产综合一区| 国产免费av一区二区凹凸四季| 久久精品亚洲成在人线a| 免费一级黄色av网站| 国产成人午夜精品福利| 欧美性受xx黑人性猛交| 熟女人妻一区二区精品视频| 18禁美女无遮挡免费| av老司机亚洲一区二区| 亚洲 中文 自拍 另类 欧美 | gogo国模私拍视频| 青青草在观免费国产精品| 日韩一个色综合导航| 人人爱人人妻人人澡39| 国产精品久久久久久久久福交| 3337p日本欧洲大胆色噜噜| 1000小视频在线| 天天日天天做天天日天天做| 国产一区av澳门在线观看| 亚洲国产免费av一区二区三区| 亚洲一级特黄特黄黄色录像片| 激情色图一区二区三区| 又粗又硬又猛又黄免费30| 亚洲欧美色一区二区| 亚洲激情偷拍一区二区| 亚洲精品久久综合久| 精品亚洲国产中文自在线| 在线新三级黄伊人网| 日本av在线一区二区三区| 中文字幕日韩精品日本| 男人和女人激情视频| 日韩视频一区二区免费观看| 国产激情av网站在线观看| 经典国语激情内射视频| 亚洲av色香蕉一区二区三区| 国产刺激激情美女网站| 99re国产在线精品| 精品国产午夜视频一区二区| 国产黄色大片在线免费播放| 九色porny九色9l自拍视频| 国产片免费观看在线观看| 在线免费观看日本伦理| 欧美综合婷婷欧美综合| 婷婷色国产黑丝少妇勾搭AV| 五十路人妻熟女av一区二区| 黄色资源视频网站日韩| 国产视频一区二区午夜| 18禁无翼鸟成人在线| 中文字幕高清免费在线人妻| 91综合久久亚洲综合| 国产午夜亚洲精品不卡在线观看| 中文字幕1卡1区2区3区| 欧美精品国产综合久久| 久久精品视频一区二区三区四区| 亚洲熟女久久久36d| 国产女人叫床高潮大片视频| 亚洲美女自偷自拍11页| 青娱乐极品视频青青草| 亚洲精品国产综合久久久久久久久| 最新的中文字幕 亚洲| 女生自摸在线观看一区二区三区 | 国产av一区2区3区| 天天插天天狠天天操| 欧美日韩中文字幕欧美| 日韩欧美国产一区不卡| 青青青青青免费视频| 午夜在线观看岛国av,com| 久草视频在线免播放| 少妇人妻二三区视频| 100%美女蜜桃视频| 最新国产亚洲精品中文在线| 在线免费91激情四射| 久久永久免费精品人妻专区| 九色精品视频在线播放| 欧美成人综合色在线噜噜| 91精品资源免费观看| 久久久极品久久蜜桃| 青青青青青免费视频| 少妇人妻二三区视频| 日本精品一区二区三区在线视频。| 伊拉克及约旦宣布关闭领空| www天堂在线久久| 成年人免费看在线视频| AV天堂一区二区免费试看| 欧美黑人与人妻精品| 国产精品成久久久久三级蜜臀av| 精品高跟鞋丝袜一区二区| 丝袜美腿欧美另类 中文字幕| 91免费放福利在线观看| 黄色av网站免费在线| 天天做天天爽夜夜做少妇| 爆乳骚货内射骚货内射在线| 美女少妇亚洲精选av| 2019av在线视频| 亚洲最大黄了色网站| 亚洲一区二区三区久久午夜| 中文字幕在线观看极品视频| 92福利视频午夜1000看| 很黄很污很色的午夜网站在线观看| 欧美专区第八页一区在线播放| 日本少妇人妻xxxxxhd| 99视频精品全部15| 91麻豆精品久久久久| 99国内小视频在现欢看| 午夜大尺度无码福利视频| 日韩美av高清在线| 在线不卡成人黄色精品| 亚洲图片欧美校园春色| 日本人妻精品久久久久久| 亚洲一区二区人妻av| 人妻丝袜精品中文字幕| 边摸边做超爽毛片18禁色戒| 国产精品视频欧美一区二区| 色噜噜噜噜18禁止观看| 在线播放 日韩 av| 日本性感美女三级视频| 中文字幕免费在线免费| 又黄又刺激的午夜小视频| 黑人3p华裔熟女普通话| 久草视频在线免播放| 91亚洲手机在线视频播放| 岛国一区二区三区视频在线| 天天爽夜夜爽人人爽QC| 欧美黑人与人妻精品| 人妻素人精油按摩中出| 亚洲成人国产av在线| 一区二区三区久久久91| 欧美视频一区免费在线| 91国内精品自线在拍白富美| 国产使劲操在线播放| 2020久久躁狠狠躁夜夜躁| 亚洲欧美人精品高清| 天天日天天干天天干天天日| 在线播放 日韩 av| 亚洲 中文字幕在线 日韩| 天天日天天操天天摸天天舔| 日比视频老公慢点好舒服啊| 黄片三级三级三级在线观看| 天天干天天操天天插天天日| 黄色大片男人操女人逼| 欧美日韩精品永久免费网址| 亚洲欧美另类自拍偷拍色图| www日韩a级s片av| 日韩亚洲高清在线观看| 三级等保密码要求条款| 91大神福利视频网| 亚洲1卡2卡三卡4卡在线观看 | 欧美亚洲牲夜夜综合久久| 97少妇精品在线观看| 国产片免费观看在线观看| 天天操天天干天天日狠狠插 | 国产黄色大片在线免费播放| 中文字幕高清免费在线人妻| 欧美成人综合色在线噜噜| 2020国产在线不卡视频| 91精品免费久久久久久| 久久美欧人妻少妇一区二区三区| 精品一区二区三区午夜| 91精品国产高清自在线看香蕉网| 欧亚日韩一区二区三区观看视频| 国产精品视频男人的天堂| 超碰公开大香蕉97| 岛国免费大片在线观看| 成人综合亚洲欧美一区| 91高清成人在线视频| 免费在线看的黄网站| 在线免费观看av日韩| 丝袜国产专区在线观看| 在线网站你懂得老司机| 午夜福利资源综合激情午夜福利资| 综合精品久久久久97| 黄色男人的天堂视频| 在线不卡日韩视频播放| 国产露脸对白在线观看| 狠狠鲁狠狠操天天晚上干干| 69精品视频一区二区在线观看| 老司机99精品视频在线观看| 超pen在线观看视频公开97| 国产免费av一区二区凹凸四季| 在线观看av2025| 国产一区自拍黄视频免费观看| 又色又爽又黄又刺激av网站| 久草视频福利在线首页| 天天想要天天操天天干| 日韩一个色综合导航| 国产麻豆剧传媒精品国产av蜜桃| 一区二区三区毛片国产一区| 日韩av中文在线免费观看| 免费观看理论片完整版| 91在线视频在线精品3| 国产女人露脸高潮对白视频| 97国产在线av精品| 天天干天天操天天扣| 100%美女蜜桃视频| 国产变态另类在线观看| 精品黑人一区二区三区久久国产| 一区二区三区美女毛片| 国产一区自拍黄视频免费观看| 精品国产成人亚洲午夜| 中文字幕 码 在线视频| 欧美日韩精品永久免费网址| 免费男阳茎伸入女阳道视频| 精品久久久久久久久久久a√国产| 久久久久久久精品老熟妇| 日本五十路熟新垣里子| 偷拍自拍亚洲视频在线观看| 亚洲欧美国产综合777| 国产欧美精品一区二区高清| 韩国三级aaaaa高清视频| 亚洲av香蕉一区区二区三区犇| 2020国产在线不卡视频| 亚洲av日韩av网站| 99精品免费久久久久久久久a| 老司机你懂得福利视频| 色综合久久五月色婷婷综合| 国产精品黄页网站视频| 欧美黑人巨大性xxxxx猛交| 精产国品久久一二三产区区别| www久久久久久久久久久| 高清一区二区欧美系列| 香蕉aⅴ一区二区三区| 在线观看911精品国产| 91亚洲精品干熟女蜜桃频道| 亚洲在线免费h观看网站| 成年人该看的视频黄免费| 人妻少妇av在线观看| 19一区二区三区在线播放| 在线视频国产欧美日韩| 特级欧美插插插插插bbbbb| 亚洲av香蕉一区区二区三区犇| 国产+亚洲+欧美+另类| 久久尻中国美女视频| 日韩欧美一级黄片亚洲| 亚洲码av无色中文| 日韩欧美高清免费在线| 97少妇精品在线观看| 亚洲av日韩av第一区二区三区| 丝袜美腿欧美另类 中文字幕| av一本二本在线观看| 91色九色porny| 不卡日韩av在线观看| 久久www免费人成一看片| www日韩a级s片av| 人妻久久无码中文成人| 在线免费观看日本片| 青青草成人福利电影| 成年人啪啪视频在线观看| 午夜精品一区二区三区更新| 欧美精品久久久久久影院| 亚洲天堂有码中文字幕视频| 夜夜骑夜夜操夜夜奸| 老司机午夜精品视频资源| 亚洲最大黄了色网站| 97国产福利小视频合集| 懂色av之国产精品| 日本福利午夜电影在线观看| 91人妻人人做人人爽在线| 国产揄拍高清国内精品对白| 91超碰青青中文字幕| 中文字幕+中文字幕| 快点插进来操我逼啊视频| 欧美亚洲中文字幕一区二区三区 | 亚洲国产成人无码麻豆艾秋| 天天艹天天干天天操| 国产视频网站一区二区三区 | 啪啪啪操人视频在线播放| 99精品一区二区三区的区| 19一区二区三区在线播放| 同居了嫂子在线播高清中文| 韩国黄色一级二级三级| 人妻凌辱欧美丰满熟妇| 91中文字幕免费在线观看| 91国产资源在线视频| 色综合色综合色综合色| 人妻爱爱 中文字幕| 白嫩白嫩美女极品国产在线观看| 精品欧美一区二区vr在线观看| 老师啊太大了啊啊啊尻视频| 成人av中文字幕一区| 天堂av在线官网中文| av网址国产在线观看| 日韩欧美在线观看不卡一区二区| 国产女人被做到高潮免费视频| 中国产一级黄片免费视频播放| 夜夜骑夜夜操夜夜奸| 93精品视频在线观看| 欧美偷拍亚洲一区二区| 成人性爱在线看四区| 一级黄色片夫妻性生活| 强行扒开双腿猛烈进入免费版| www久久久久久久久久久| 中文乱理伦片在线观看| 精品国产污污免费网站入口自 | 天天日夜夜干天天操| 同居了嫂子在线播高清中文| 国产无遮挡裸体免费直播视频| 日本黄色三级高清视频| 在线国产日韩欧美视频| 人人在线视频一区二区| 日韩欧美国产一区ab| 一级黄片久久久久久久久| 98视频精品在线观看| 亚洲va国产va欧美va在线| gay gay男男瑟瑟在线网站| 亚洲综合在线观看免费| 久久这里只有精品热视频| 玩弄人妻熟妇性色av少妇| 自拍偷区二区三区麻豆| 成人午夜电影在线观看 久久| 蜜臀av久久久久久久| 爆乳骚货内射骚货内射在线 | 97人妻无码AV碰碰视频| av视屏免费在线播放| 91亚洲精品干熟女蜜桃频道 | 日韩av大胆在线观看| 久久久久久九九99精品| 偷青青国产精品青青在线观看 | 精品少妇一二三视频在线| 美女日逼视频免费观看| 黑人解禁人妻叶爱071| 亚洲天堂有码中文字幕视频| 99国产精品窥熟女精品| 一区二区三区欧美日韩高清播放| 午夜成午夜成年片在线观看| 在线观看操大逼视频| 午夜精品一区二区三区更新| 日噜噜噜夜夜噜噜噜天天噜噜噜| 又粗又长 明星操逼小视频| 天天日天天摸天天爱| 2020av天堂网在线观看| 老司机深夜免费福利视频在线观看| 天天干天天爱天天色| 亚洲中文字幕综合小综合| 在线视频精品你懂的| 天天干天天爱天天色| 久久艹在线观看视频| 天天日天天干天天舔天天射| 制服丝袜在线人妻中文字幕| 欧美久久久久久三级网| 91精品一区二区三区站长推荐| 日本熟妇色熟妇在线观看| 美女在线观看日本亚洲一区| 美女在线观看日本亚洲一区| 亚洲 清纯 国产com| 日韩美在线观看视频黄| 日韩人妻xxxxx| 9色在线视频免费观看| 久久久久久久99精品| 亚洲 图片 欧美 图片| 熟女妇女老妇一二三区| 被大鸡吧操的好舒服视频免费| 特黄老太婆aa毛毛片| 免费无码人妻日韩精品一区二区| aⅴ精产国品一二三产品| 中文亚洲欧美日韩无线码| 国产成人自拍视频在线免费观看| 国产欧美日韩在线观看不卡| 日韩激情文学在线视频| 精品国产在线手机在线| 精品久久久久久久久久中文蒉| 18禁污污污app下载| 精品美女久久久久久| 97人妻总资源视频| 久久免费看少妇高潮完整版| 欧美地区一二三专区| 天天干夜夜操天天舔| av中文字幕网址在线| 亚洲成人免费看电影| av在线观看网址av| 日本一区美女福利视频| 亚洲高清国产拍青青草原| 中国无遮挡白丝袜二区精品| 春色激情网欧美成人| 国产在线免费观看成人| 国产a级毛久久久久精品| 在线观看av2025| 亚洲av色图18p| 日本黄在免费看视频| 天天日天天玩天天摸| 亚洲一区二区三区偷拍女厕91| 女生被男生插的视频网站| 成人18禁网站在线播放| 成人亚洲精品国产精品| 2021最新热播中文字幕| 一区二区三区视频,福利一区二区 丰满的子国产在线观看 | 沈阳熟妇28厘米大战黑人| 福利视频网久久91| 91亚洲手机在线视频播放| 自拍偷拍,中文字幕| 亚洲精品一区二区三区老狼| 日本一二三中文字幕| 日韩在线中文字幕色| 免费观看丰满少妇做受| 任你操任你干精品在线视频| 性感美女高潮视频久久久| nagger可以指黑人吗| 在线免费观看国产精品黄色| 久久99久久99精品影院| 成人在线欧美日韩国产| 欧美日韩熟女一区二区三区| 亚洲国产精品黑丝美女| yy96视频在线观看| av久久精品北条麻妃av观看| 亚洲国产最大av综合| 亚洲精品一区二区三区老狼| 亚洲欧美色一区二区| 亚洲2021av天堂| 福利视频广场一区二区| 少妇与子乱在线观看| 亚洲区欧美区另类最新章节| 亚洲高清视频在线不卡| 小泽玛利亚视频在线观看| 国产一区二区欧美三区| 亚洲 欧美 自拍 偷拍 在线| 91精品国产高清自在线看香蕉网 | 欧美亚洲自偷自拍 在线| 综合一区二区三区蜜臀| 18禁美女无遮挡免费| 人妻久久无码中文成人| weyvv5国产成人精品的视频| 五十路在线观看完整版| 人妻熟女在线一区二区| 特级欧美插插插插插bbbbb| 免费av岛国天堂网站| 国产1区,2区,3区| 日本特级片中文字幕| 美洲精品一二三产区区别| 国产高清女主播在线| 免费费一级特黄真人片| 激情啪啪啪啪一区二区三区| 青青青爽视频在线播放| 黑人巨大精品欧美视频| 亚洲精品午夜aaa久久| 男生用鸡操女生视频动漫| 自拍偷拍日韩欧美亚洲| 免费观看理论片完整版| 香港一级特黄大片在线播放| 人妻无码中文字幕专区| 国产精品女邻居小骚货| 少妇人妻真实精品视频| 黄色大片免费观看网站| 天天射夜夜操狠狠干| aⅴ精产国品一二三产品| 80电影天堂网官网| 中文字幕在线乱码一区二区 | 孕妇奶水仑乱A级毛片免费看| 真实国模和老外性视频| 亚洲精品一线二线在线观看| 国产成人无码精品久久久电影| 国产精品视频资源在线播放| 日韩熟女av天堂系列| 亚洲av色香蕉一区二区三区| 丝袜肉丝一区二区三区四区在线| 亚洲欧美清纯唯美另类| 美女av色播在线播放| 亚洲熟妇无码一区二区三区| 同居了嫂子在线播高清中文| 青青擦在线视频国产在线| 绝色少妇高潮3在线观看| 91极品大一女神正在播放| 天天插天天狠天天操| 中文字幕一区二区人妻电影冢本| 精品区一区二区三区四区人妻 | 亚洲av天堂在线播放| 免费国产性生活视频| 国产精品午夜国产小视频| 青青青视频自偷自拍38碰| 丰满的子国产在线观看| 在线观看操大逼视频| 91精品一区二区三区站长推荐| 中文字幕高清资源站| 国产之丝袜脚在线一区二区三区| 亚洲1区2区3区精华液| 加勒比视频在线免费观看| 这里有精品成人国产99| 国产精品国产三级国产午| 啪啪啪18禁一区二区三区| 欧美黄片精彩在线免费观看| 国产麻豆91在线视频| 亚洲粉嫩av一区二区三区| 亚洲精品 欧美日韩| 99久久久无码国产精品性出奶水| 精品国产乱码一区二区三区乱| 亚洲卡1卡2卡三卡四老狼| 亚洲无码一区在线影院| 亚洲伊人色一综合网| 黑人3p华裔熟女普通话| 亚洲欧美国产综合777| 久草极品美女视频在线观看| 中文字幕人妻熟女在线电影| 一区二区三区久久中文字幕| 欧美中国日韩久久精品| 一级黄片久久久久久久久| 一区二区三区美女毛片| 欧美日韩熟女一区二区三区| 欧美另类一区二区视频| 国产高清精品极品美女| 2022天天干天天操| 色av色婷婷人妻久久久精品高清| 一区二区三区精品日本| 人人妻人人澡欧美91精品| 亚洲超碰97人人做人人爱| 人妻av无码专区久久绿巨人| 久久久制服丝袜中文字幕| 日本丰满熟妇大屁股久久| 深夜男人福利在线观看| 风流唐伯虎电视剧在线观看| 午夜在线观看一区视频| 亚洲天堂成人在线观看视频网站| 又黄又刺激的午夜小视频| 男人天堂最新地址av| 国产亚洲视频在线二区| 成人亚洲国产综合精品| 免费在线观看污污视频网站| 宅男噜噜噜666国产| 66久久久久久久久久久| 特一级特级黄色网片| 国产精品视频欧美一区二区| 一二三中文乱码亚洲乱码one| 国产午夜男女爽爽爽爽爽视频| 欧美一区二区三区高清不卡tv| 欧美在线一二三视频| 亚洲人一区二区中文字幕| 最新日韩av传媒在线| 国产综合精品久久久久蜜臀| 阿v天堂2014 一区亚洲| jul—619中文字幕在线| 日日摸夜夜添夜夜添毛片性色av| 93视频一区二区三区| yy6080国产在线视频| 四川五十路熟女av| 久久久极品久久蜜桃| 亚洲国产成人无码麻豆艾秋| 国产极品精品免费视频| 动漫美女的小穴视频| 欧美成人小视频在线免费看| 免费在线黄色观看网站| 久久这里有免费精品| 欧洲精品第一页欧洲精品亚洲 | 国产使劲操在线播放| 少妇被强干到高潮视频在线观看| 狠狠的往里顶撞h百合| 人妻少妇性色欲欧美日韩| 亚洲 人妻 激情 中文| 免费大片在线观看视频网站| 99热久久这里只有精品| av欧美网站在线观看| ka0ri在线视频| 一个色综合男人天堂| 骚逼被大屌狂草视频免费看| 91九色国产熟女一区二区| 国产清纯美女al在线| 57pao国产一区二区| 18禁美女黄网站色大片下载| 91中文字幕最新合集| rct470中文字幕在线| 在线不卡成人黄色精品| 999九九久久久精品| 大鸡吧插入女阴道黄色片| 午夜的视频在线观看| 婷婷综合亚洲爱久久| 午夜91一区二区三区| 99视频精品全部15| 亚洲av日韩av第一区二区三区| 精品欧美一区二区vr在线观看 | 喷水视频在线观看这里只有精品| 丝袜美腿视频诱惑亚洲无| 91精品国产91青青碰| 亚洲一区av中文字幕在线观看| 日韩伦理短片在线观看| 搞黄色在线免费观看| 亚洲精品 欧美日韩| 免费无码人妻日韩精品一区二区 | 天天干天天爱天天色| 99热久久这里只有精品8| 国产日本欧美亚洲精品视| 色哟哟国产精品入口| 啪啪啪18禁一区二区三区 | 五月精品丁香久久久久福利社| 91精品资源免费观看| 夜色福利视频在线观看| AV天堂一区二区免费试看| 国产亚洲成人免费在线观看| 中文字幕无码日韩专区免费| 男人的天堂在线黄色| 亚洲 自拍 色综合图| 亚洲最大黄 嗯色 操 啊| 2020中文字幕在线播放| 97精品视频在线观看| 97精品人妻一区二区三区精品| 丰满的继坶3中文在线观看| 天天干夜夜操啊啊啊| 久久农村老妇乱69系列| 天堂av在线播放免费| 日韩人妻在线视频免费| 亚洲一区二区三区精品乱码| 免费男阳茎伸入女阳道视频 | 80电影天堂网官网| 国产av自拍偷拍盛宴| 在线免费观看日本伦理| 四川乱子伦视频国产vip| 亚洲一区二区人妻av| 啊啊啊想要被插进去视频| 亚洲人妻视频在线网| 日视频免费在线观看| 小泽玛利亚视频在线观看| 欧美一区二区三区激情啪啪啪 | 1000部国产精品成人观看视频| 亚洲一区久久免费视频| 日本少妇人妻xxxxx18|