国产无遮挡裸体免费直播视频,久久精品国产蜜臀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

最新評論

tube69日本少妇| 99精品视频之69精品视频 | 国产黄色大片在线免费播放| 亚洲无线观看国产高清在线| 一区二区熟女人妻视频| 日本熟女精品一区二区三区| 天天日天天干天天要| 91传媒一区二区三区| 日韩写真福利视频在线观看| 免费在线播放a级片| 色婷婷久久久久swag精品| 大香蕉日本伊人中文在线| 一级A一级a爰片免费免会员| xxx日本hd高清| 国产九色91在线视频| 91亚洲精品干熟女蜜桃频道| 传媒在线播放国产精品一区| 国产精品国产三级麻豆| 在线观看免费岛国av| 中文字幕第三十八页久久| 扒开让我视频在线观看| 狠狠操狠狠操免费视频| 福利视频网久久91| 久久艹在线观看视频| 青青青青青青青在线播放视频| 91中文字幕免费在线观看| xxx日本hd高清| 免费观看成年人视频在线观看| 亚洲自拍偷拍精品网| 日本性感美女三级视频| 中文字幕第三十八页久久| 欧美日韩一区二区电影在线观看| 欧美日韩不卡一区不区二区| 青青青国产片免费观看视频| 热思思国产99re| 久久久久久性虐视频| 欧美一区二区三区高清不卡tv| 中文字幕乱码人妻电影| 99国内小视频在现欢看| 桃色视频在线观看一区二区 | 亚洲 清纯 国产com| 日日夜夜精品一二三| 欧美老妇精品另类不卡片| 青青操免费日综合视频观看| 涩涩的视频在线观看视频| 91老熟女连续高潮对白| av网址国产在线观看| 91人妻精品一区二区久久| 91麻豆精品传媒国产黄色片| 少妇高潮一区二区三区| 亚洲精品国产在线电影| 中文字幕第一页国产在线| 亚洲图库另类图片区| 和邻居少妇愉情中文字幕| 把腿张开让我插进去视频| 女生被男生插的视频网站| 日韩欧美制服诱惑一区在线| 97超碰人人搞人人| 亚洲高清免费在线观看视频| 人妻爱爱 中文字幕| 岳太深了紧紧的中文字幕| 亚欧在线视频你懂的| 天天操天天弄天天射| 国产之丝袜脚在线一区二区三区| 亚洲精品色在线观看视频| 人妻素人精油按摩中出| 亚洲国产精品免费在线观看| 中文字幕人妻av在线观看 | 久久精品亚洲成在人线a| 男人的天堂一区二区在线观看| 日本少妇高清视频xxxxx | 手机看片福利盒子日韩在线播放| 国产高清精品一区二区三区| 人人爽亚洲av人人爽av| 啪啪啪18禁一区二区三区| 欧美精品久久久久久影院| 在线国产中文字幕视频| 天天射夜夜操综合网| 蜜臀av久久久久蜜臀av麻豆| 中文字幕熟女人妻久久久| 精品国产污污免费网站入口自 | 东游记中文字幕版哪里可以看到| 欧洲亚洲欧美日韩综合| 可以免费看的www视频你懂的| 57pao国产一区二区| 精品一区二区三区午夜| 亚洲av色香蕉一区二区三区| 超污视频在线观看污污污| 午夜精品亚洲精品五月色| 91久久精品色伊人6882| 超级av免费观看一区二区三区| 人妻少妇一区二区三区蜜桃| 搡老熟女一区二区在线观看| 午夜的视频在线观看| 自拍偷拍一区二区三区图片| 国产片免费观看在线观看| 国产视频在线视频播放| 中文字幕日韩精品日本| 天天干狠狠干天天操| 国产视频一区在线观看| 护士特殊服务久久久久久久| 国产91嫩草久久成人在线视频| 天天操天天干天天艹| 成人亚洲精品国产精品| av俺也去在线播放| 在线不卡日韩视频播放| 亚洲欧美综合另类13p| 黄色在线观看免费观看在线| 第一福利视频在线观看| 日韩欧美制服诱惑一区在线| 中文人妻AV久久人妻水| 久久www免费人成一看片| 40道精品招牌菜特色| 2021国产一区二区| 国产精品日韩欧美一区二区| 国产麻豆剧传媒精品国产av蜜桃| 老司机免费福利视频网| 成人伊人精品色xxxx视频| 国产大鸡巴大鸡巴操小骚逼小骚逼| 97超碰最新免费在线观看| 亚洲国产在人线放午夜| 国产精品久久久久久久女人18| 老师啊太大了啊啊啊尻视频| 色天天天天射天天舔| 2022国产综合在线干| 97超碰人人搞人人| 亚洲区美熟妇久久久久| 亚洲天堂第一页中文字幕| 日韩av免费观看一区| 97年大学生大白天操逼| 欧美一区二区三区乱码在线播放| 孕妇奶水仑乱A级毛片免费看| av天堂中文字幕最新| 家庭女教师中文字幕在线播放| 3337p日本欧洲大胆色噜噜| 午夜精品久久久久久99热| 人妻素人精油按摩中出| eeuss鲁片一区二区三区| 韩国黄色一级二级三级| 麻豆性色视频在线观看| 日比视频老公慢点好舒服啊| 91九色国产porny蝌蚪| 精品久久久久久久久久久a√国产| 国产精品人妻熟女毛片av久| 99热国产精品666| 99久久久无码国产精品性出奶水| 专门看国产熟妇的网站| 国产大鸡巴大鸡巴操小骚逼小骚逼| 亚洲欧美一卡二卡三卡| 天天日天天日天天射天天干| 大香蕉福利在线观看| 色偷偷伊人大杳蕉综合网| 国产欧美精品一区二区高清 | 欧美交性又色又爽又黄麻豆| 视频二区在线视频观看| 天天操天天爽天天干| 国产亚洲四十路五十路| 最新97国产在线视频| 天天夜天天日天天日| 国产妇女自拍区在线观看| 成年人黄色片免费网站| 97人妻人人澡爽人人精品| 日曰摸日日碰夜夜爽歪歪| 欧美日韩不卡一区不区二区| 亚洲天堂有码中文字幕视频| 日本一道二三区视频久久 | 日本男女操逼视频免费看| 亚洲人妻国产精品综合| 亚洲午夜伦理视频在线| 亚洲码av无色中文| 男女啪啪视频免费在线观看| 婷婷激情四射在线观看视频| 天天操天天爽天天干| 精品欧美一区二区vr在线观看| 自拍偷拍 国产资源| 激情色图一区二区三区| 十八禁在线观看地址免费| 一二三中文乱码亚洲乱码one| 插小穴高清无码中文字幕| 国产无遮挡裸体免费直播视频| 亚洲午夜在线视频福利| 最新中文字幕乱码在线| 欧美日韩国产一区二区三区三州| 97超碰最新免费在线观看| 日本一二三中文字幕| 中文 成人 在线 视频| 97精品成人一区二区三区| 亚洲嫩模一区二区三区| 婷婷午夜国产精品久久久| 一区二区三区四区五区性感视频| 极品性荡少妇一区二区色欲| 丝袜亚洲另类欧美变态| 日韩人妻在线视频免费| 日韩精品电影亚洲一区| 91国内精品自线在拍白富美| 好吊操视频这里只有精品| 国产又粗又硬又猛的毛片视频| 一区国内二区日韩三区欧美| 欧美日韩中文字幕欧美| 777奇米久久精品一区| 日韩特级黄片高清在线看| 在线新三级黄伊人网| 亚洲一区二区激情在线| 免费在线播放a级片| 日本午夜福利免费视频| 91精品国产91青青碰| 日韩精品中文字幕福利| 天天插天天色天天日| 亚洲成人av一区在线| 97色视频在线观看| 2021天天色天天干| 大陆精品一区二区三区久久| 精品国产在线手机在线| 亚洲成人午夜电影在线观看| 国产精品久久9999| 欧美精品 日韩国产| 亚洲成人国产综合一区| 亚洲嫩模一区二区三区| 国产精品一区二区av国| 成人区人妻精品一区二视频| 欧美色婷婷综合在线| 桃色视频在线观看一区二区| 国产亚洲欧美另类在线观看| 香蕉片在线观看av| 国产视频网站一区二区三区| 青青草精品在线视频观看| 91极品新人『兔兔』精品新作| 午夜精彩视频免费一区| 青青操免费日综合视频观看| 视频一区 二区 三区 综合| 成人av免费不卡在线观看| 中国视频一区二区三区| 免费观看污视频网站| 老司机福利精品视频在线| 婷婷综合蜜桃av在线| 亚洲成人黄色一区二区三区| 在线网站你懂得老司机| 亚洲av琪琪男人的天堂| 国产精品久久久久久久久福交| 日韩a级黄色小视频| 在线 中文字幕 一区| 久久热这里这里只有精品| 天堂女人av一区二区| 中文字幕奴隷色的舞台50| 成人国产小视频在线观看| 中文字幕日韩精品日本| 最新91精品视频在线| 午夜在线观看一区视频| 亚洲人妻国产精品综合| 75国产综合在线视频| 一区国内二区日韩三区欧美| 日本美女成人在线视频| 91天堂天天日天天操| 在线观看国产免费麻豆| 中国产一级黄片免费视频播放| 伊人成人综合开心网| 日本丰满熟妇大屁股久久| 亚洲精品 日韩电影| 性感美女福利视频网站| chinese国产盗摄一区二区| 亚洲av人人澡人人爽人人爱| 国产福利小视频大全| 五十路老熟女码av| 最近的中文字幕在线mv视频| 亚洲一级 片内射视正片| av手机在线观播放网站| 大香蕉伊人国产在线| 中文字幕人妻一区二区视频| 国产高清在线在线视频| 欧美亚洲一二三区蜜臀| 欧美精品伦理三区四区| 亚洲欧美久久久久久久久| 老司机99精品视频在线观看 | 日辽宁老肥女在线观看视频| 国产视频精品资源网站| 日韩剧情片电影在线收看| 亚洲激情唯美亚洲激情图片| 中文 成人 在线 视频| 18禁网站一区二区三区四区| 久青青草视频手机在线免费观看| 一区二区久久成人网| 一区二区麻豆传媒黄片| 91极品新人『兔兔』精品新作| 操日韩美女视频在线免费看| 家庭女教师中文字幕在线播放| 自拍偷拍,中文字幕| 美女吃鸡巴操逼高潮视频| 播放日本一区二区三区电影| 丝袜肉丝一区二区三区四区在线| 色天天天天射天天舔| 搡老妇人老女人老熟女| 福利国产视频在线观看| 国产乱子伦一二三区| 5528327男人天堂| 青娱乐在线免费视频盛宴| 一区二区三区av高清免费| 免费无码人妻日韩精品一区二区| 日本午夜爽爽爽爽爽视频在线观看 | 色偷偷伊人大杳蕉综合网| 91小伙伴中女熟女高潮| 一区二区三区四区视频| 日本一道二三区视频久久| 日韩美女综合中文字幕pp| 国产成人精品久久二区91| 九色视频在线观看免费| 国产一区自拍黄视频免费观看| 国产品国产三级国产普通话三级| 国产黄色片在线收看| 一区二区三区的久久的蜜桃的视频 | 99久久超碰人妻国产| 老鸭窝日韩精品视频观看| 精品区一区二区三区四区人妻| 天天日天天舔天天射进去| 免费在线福利小视频| 九色精品视频在线播放| 青青青国产片免费观看视频| 国产女人被做到高潮免费视频 | 国产高潮无码喷水AV片在线观看| 欧美视频中文一区二区三区| 青草亚洲视频在线观看| 天天操天天操天天碰| 精品首页在线观看视频| 黄色中文字幕在线播放| 抽查舔水白紧大视频| 美洲精品一二三产区区别| 天天日夜夜操天天摸| 视频一区 二区 三区 综合| 欧美中文字幕一区最新网址| 亚洲中文字幕乱码区| 又大又湿又爽又紧A视频| 超黄超污网站在线观看| 香蕉91一区二区三区| 18禁美女黄网站色大片下载| 国产chinesehd精品麻豆| 哥哥姐姐综合激情小说| 婷婷五月亚洲综合在线| 国产九色91在线观看精品| 精品日产卡一卡二卡国色天香 | 啊啊好慢点插舔我逼啊啊啊视频| 91中文字幕免费在线观看| 黑人进入丰满少妇视频| 好吊操视频这里只有精品| 亚洲av成人免费网站| weyvv5国产成人精品的视频| 午夜91一区二区三区| 在线国产中文字幕视频| 亚洲国产精品久久久久久6| 黄网十四区丁香社区激情五月天| 欧洲日韩亚洲一区二区三区| 一区二区三区日本伦理| 97精品综合久久在线| 2o22av在线视频| 边摸边做超爽毛片18禁色戒| 一区二区三区的久久的蜜桃的视频| 又色又爽又黄的美女裸体| 国产伊人免费在线播放| 亚洲人成精品久久久久久久| gogo国模私拍视频| 999九九久久久精品| 九九热99视频在线观看97| 成人福利视频免费在线| 亚洲的电影一区二区三区| 动漫美女的小穴视频| 国产性色生活片毛片春晓精品| 春色激情网欧美成人| av天堂资源最新版在线看| jul—619中文字幕在线| 国产亚洲欧美另类在线观看| 91啪国自产中文字幕在线| 天天爽夜夜爽人人爽QC| 男人和女人激情视频| 国产熟妇人妻ⅹxxxx麻豆| 天天色天天爱天天爽| 激情内射在线免费观看| 亚洲中文精品人人免费| 99热国产精品666| 天天色天天舔天天射天天爽| 人妻在线精品录音叫床| 亚洲综合另类精品小说| 91久久精品色伊人6882| 自拍偷拍 国产资源| 人妻丝袜av在线播放网址| 同居了嫂子在线播高清中文| av天堂资源最新版在线看| 秋霞午夜av福利经典影视| 亚洲成人av一区久久| 天天摸天天日天天操| 免费av岛国天堂网站| 色花堂在线av中文字幕九九| 亚洲精品高清自拍av| 9久在线视频只有精品| 天天躁日日躁狠狠躁躁欧美av| 国产视频网站一区二区三区| 日本熟女50视频免费| 成人国产影院在线观看| 久久久久久久久久性潮| 五十路人妻熟女av一区二区| 精品日产卡一卡二卡国色天香| 韩国一级特黄大片做受| 成人国产小视频在线观看| av中文字幕福利网| 一级黄片久久久久久久久| 一区二区久久成人网| 91免费放福利在线观看| 国产第一美女一区二区三区四区 | 黄片大全在线观看观看| 成人av免费不卡在线观看| 青草久久视频在线观看| 99精品久久久久久久91蜜桃| av天堂中文字幕最新| 亚洲一区二区三区久久午夜| 少妇与子乱在线观看| 91亚洲国产成人精品性色| 亚洲成人免费看电影| 黑人解禁人妻叶爱071| 国产一级精品综合av| 中国黄色av一级片| caoporn蜜桃视频| 少妇高潮无套内谢麻豆| caoporn蜜桃视频| 日韩人妻xxxxx| 欧美一区二区三区久久久aaa| 大尺度激情四射网站| 国产精品午夜国产小视频| 天码人妻一区二区三区在线看| 免费一级特黄特色大片在线观看| 91色九色porny| 青青青青操在线观看免费| 粉嫩av懂色av蜜臀av| 国产精品视频资源在线播放 | 性感美女福利视频网站| 中文字幕中文字幕人妻| 高潮视频在线快速观看国家快速| 亚洲成人熟妇一区二区三区| 成人激情文学网人妻| 亚洲精品久久视频婷婷| 亚洲国际青青操综合网站| 国产亚洲视频在线观看| 少妇人妻100系列| 日本少妇人妻xxxxx18| 亚洲午夜伦理视频在线| 青青伊人一精品视频| 精品高跟鞋丝袜一区二区| 污污小视频91在线观看| 在线免费91激情四射| 在线观看国产网站资源| 亚洲午夜高清在线观看| 亚洲av香蕉一区区二区三区犇| 在线亚洲天堂色播av电影| 黄色片一级美女黄色片| 综合国产成人在线观看| 久草视频在线看免费| 亚洲天堂第一页中文字幕| 欧美性感尤物人妻在线免费看 | 中文字幕之无码色多多| 一区二区三区蜜臀在线| 直接能看的国产av| 狠狠躁夜夜躁人人爽天天天天97| 中文字幕最新久久久| 大陆av手机在线观看| 一二三区在线观看视频| 水蜜桃一区二区三区在线观看视频| 亚洲av琪琪男人的天堂| 人妻在线精品录音叫床| 久久精品国产23696| 2020久久躁狠狠躁夜夜躁| 国产麻豆剧传媒精品国产av蜜桃| 中文字幕在线观看极品视频| 亚洲 中文 自拍 无码| 夜夜嗨av蜜臀av| 国产激情av网站在线观看| av大全在线播放免费| 成人av免费不卡在线观看| 国产av福利网址大全| 91在线免费观看成人| 精品国产乱码一区二区三区乱| 女同性ⅹxx女同h偷拍| 国产亚洲视频在线二区| 我想看操逼黄色大片| 黄工厂精品视频在线观看| 五月天色婷婷在线观看视频免费| 55夜色66夜色国产精品站| 超级碰碰在线视频免费观看| 天天日天天干天天插舔舔| 一二三中文乱码亚洲乱码one| 五十路息与子猛烈交尾视频| 久久香蕉国产免费天天| 午夜91一区二区三区| 最新中文字幕乱码在线| 国产高清在线在线视频| 亚洲午夜精品小视频| 日韩美在线观看视频黄| 国产午夜激情福利小视频在线| 国产亚洲天堂天天一区| 换爱交换乱高清大片| 亚洲天堂精品福利成人av| av老司机精品在线观看| av老司机亚洲一区二区| 天天日天天透天天操| 中文字幕在线观看极品视频| 岛国一区二区三区视频在线| 又粗又硬又猛又黄免费30| 色婷婷精品大在线观看| 日韩北条麻妃一区在线| 精品国产污污免费网站入口自| 亚洲欧美一区二区三区爱爱动图| 精品久久婷婷免费视频| 又粗又硬又猛又黄免费30| 在线观看的黄色免费网站| 久久精品视频一区二区三区四区 | 国产精品中文av在线播放| 国产一区成人在线观看视频| 国产精品人久久久久久| 黄片三级三级三级在线观看| 精彩视频99免费在线| 91小伙伴中女熟女高潮| 亚洲最大免费在线观看| 97年大学生大白天操逼| 成年人中文字幕在线观看| 大尺度激情四射网站| 国产精品久久久久久美女校花| 人人妻人人爽人人添夜| 人妻无码色噜噜狠狠狠狠色| 婷婷久久久久深爱网| 熟女俱乐部一二三区| 乱亲女秽乱长久久久| 在线观看视频一区麻豆| 色婷婷精品大在线观看| 亚洲成人精品女人久久久| 偷拍自拍亚洲视频在线观看| 美女福利视频网址导航| 18禁美女无遮挡免费| 中文字幕第三十八页久久 | 中文字幕在线欧美精品| 国产欧美日韩在线观看不卡| 2o22av在线视频| 中文字幕熟女人妻久久久| 99热碰碰热精品a中文| 51精品视频免费在线观看| 亚洲av色图18p| 天天艹天天干天天操| 97精品人妻一区二区三区精品| 国产在线观看黄色视频| tube69日本少妇| 成人网18免费视频版国产| 欧美亚洲牲夜夜综合久久| 亚洲精品三级av在线免费观看| 欧美伊人久久大香线蕉综合| 亚洲成人午夜电影在线观看| 亚洲精品国产综合久久久久久久久 | 亚洲天堂有码中文字幕视频| 欧美另类一区二区视频| 小穴多水久久精品免费看| 精品久久久久久久久久久99| 国产在线拍揄自揄视频网站| 亚洲人妻国产精品综合| 国产一区二区火爆视频| 国产精品人久久久久久| 人人妻人人爽人人添夜| 青青青青青操视频在线观看| 在线观看日韩激情视频| 国产普通话插插视频| 色婷婷久久久久swag精品| 日韩亚国产欧美三级涩爱| 日视频免费在线观看| 亚洲一级av无码一级久久精品| av天堂中文免费在线| 东游记中文字幕版哪里可以看到| 嫩草aⅴ一区二区三区| 精品一区二区亚洲欧美| 粉嫩欧美美人妻小视频| 亚洲护士一区二区三区| 国产精品黄片免费在线观看| 一级黄色av在线观看| 日本脱亚入欧是指什么| 亚洲福利精品视频在线免费观看 | 91试看福利一分钟| 2022精品久久久久久中文字幕| av完全免费在线观看av| 熟妇一区二区三区高清版| 国产大学生援交正在播放| 91国产资源在线视频| 2019av在线视频| 自拍偷拍日韩欧美亚洲| 99久久99一区二区三区| 成人H精品动漫在线无码播放| 亚洲精品午夜aaa久久| 国产va在线观看精品| 97青青青手机在线视频| 激情五月婷婷免费视频| 亚洲国产欧美一区二区三区久久| 日视频免费在线观看| 亚洲福利天堂久久久久久| 日韩近亲视频在线观看| 丰满的继坶3中文在线观看| av手机在线免费观看日韩av| 午夜蜜桃一区二区三区| 亚洲激情,偷拍视频| 美女福利写真在线观看视频| 亚洲综合色在线免费观看| 日韩伦理短片在线观看| 91老熟女连续高潮对白| 中文字幕之无码色多多| 一二三区在线观看视频| 国产精品欧美日韩区二区| 在线观看av2025| 亚洲精品av在线观看| 国产成人精品av网站| 99久久久无码国产精品性出奶水 | 欧美精产国品一二三产品价格| 亚洲av极品精品在线观看| 在线观看国产免费麻豆| 在线观看一区二区三级| 久草极品美女视频在线观看| 2018在线福利视频| 亚洲成人黄色一区二区三区| 青娱乐极品视频青青草| 人妻丝袜榨强中文字幕| 午夜在线精品偷拍一区二| 国产高清在线观看1区2区| 视频一区二区综合精品| av完全免费在线观看av| 午夜在线观看岛国av,com| 特级无码毛片免费视频播放| 99的爱精品免费视频| 国产97视频在线精品| 国产日韩精品一二三区久久久| 午夜精品一区二区三区更新| 啪啪啪啪啪啪啪啪av| 最新欧美一二三视频 | 视频一区二区在线免费播放| 天天射夜夜操综合网| 久精品人妻一区二区三区| 在线观看av2025| www日韩毛片av| 日本一二三中文字幕| 绝顶痉挛大潮喷高潮无码 | 99av国产精品欲麻豆| 午夜精品福利一区二区三区p | 国产亚洲四十路五十路| 欧美成人精品欧美一级黄色| 中文字幕一区二区三区蜜月| 姐姐的朋友2在线观看中文字幕 | 欧美精品黑人性xxxx| 人妻素人精油按摩中出| 成人免费公开视频无毒| 91精品国产黑色丝袜| 亚洲午夜电影之麻豆| 丝袜国产专区在线观看| 亚洲男人让女人爽的视频| 大香蕉日本伊人中文在线| 国产精品国产三级国产午| 51国产成人精品视频| 宅男噜噜噜666免费观看| 午夜激情高清在线观看| 日韩人妻xxxxx| 亚洲老熟妇日本老妇| 初美沙希中文字幕在线 | 黑人解禁人妻叶爱071| 国产一区二区久久久裸臀| 亚洲av色图18p| brazzers欧熟精品系列| 日韩欧美中文国产在线| 欧美精品亚洲精品日韩在线| 1区2区3区4区视频在线观看| 午夜蜜桃一区二区三区| 888欧美视频在线| 欧美中文字幕一区最新网址| 久久久久久久一区二区三| 精品成人啪啪18免费蜜臀| 中国把吊插入阴蒂的视频| 国产精品久久久久久久久福交| 欧美性受xx黑人性猛交| 在线视频这里只有精品自拍| 孕妇奶水仑乱A级毛片免费看| 婷婷综合亚洲爱久久| 毛茸茸的大外阴中国视频| 区一区二区三国产中文字幕| 最新91九色国产在线观看| 在线观看的a站 最新| 国产麻豆精品人妻av| 欧美日韩激情啪啪啪| 久久久久国产成人精品亚洲午夜| 欧美日韩情色在线观看| 欧美一级片免费在线成人观看 | 熟女在线视频一区二区三区| 亚洲成av人无码不卡影片一| 午夜成午夜成年片在线观看 | 淫秽激情视频免费观看| 亚洲精品午夜久久久久| 国产视频精品资源网站| 91精品国产91久久自产久强| av亚洲中文天堂字幕网| 3344免费偷拍视频| 天天日天天做天天日天天做| 亚洲av日韩高清hd| jul—619中文字幕在线| 在线免费观看靠比视频的网站| 一区二区在线观看少妇| 亚洲午夜电影之麻豆| 免费无码人妻日韩精品一区二区| 精品国产高潮中文字幕| 久久精品36亚洲精品束缚| 一区二区熟女人妻视频| 欧美熟妇一区二区三区仙踪林| 日韩av有码一区二区三区4 | 国产乱子伦一二三区| 在线制服丝袜中文字幕| 亚洲成人国产av在线| 91香蕉成人app下载| 亚洲国产欧美国产综合在线| 国产精品久久久久久久女人18| 在线新三级黄伊人网| 中国无遮挡白丝袜二区精品| 亚洲欧美一区二区三区爱爱动图| 日本av在线一区二区三区| 大陆精品一区二区三区久久| 国产精品污污污久久| 97精品综合久久在线| 亚洲综合图片20p| 亚洲人成精品久久久久久久| av天堂中文免费在线| 中文字幕 人妻精品| 中文字幕乱码人妻电影| 黑人巨大精品欧美视频| 亚洲的电影一区二区三区| 18禁无翼鸟成人在线| 日韩视频一区二区免费观看| 日本熟妇一区二区x x| yellow在线播放av啊啊啊| ka0ri在线视频| 久久这里只有精品热视频| 日韩欧美一级黄片亚洲| 国产三级影院在线观看| 国产一区二区视频观看| 中文字幕网站你懂的| 日本午夜福利免费视频| 亚洲精品午夜久久久久| 成人24小时免费视频| 午夜在线观看一区视频| 99久久中文字幕一本人| 欧美爆乳肉感大码在线观看| 新婚人妻聚会被中出| av俺也去在线播放| 四川乱子伦视频国产vip| av大全在线播放免费| 成人av中文字幕一区| 熟女俱乐部一二三区| 日韩精品激情在线观看| 中文字幕在线欧美精品| 韩国黄色一级二级三级| 国产高清在线在线视频| 在线观看视频污一区| 在线免费观看视频一二区| 91精品一区二区三区站长推荐| 国产性生活中老年人视频网站| 中文字幕在线观看极品视频| 精品亚洲国产中文自在线| 无码国产精品一区二区高潮久久4| 天天日天天鲁天天操| 亚洲欧美另类手机在线| 青草亚洲视频在线观看| 在线国产中文字幕视频| 国产福利小视频二区| 成人sm视频在线观看| 天天日天天干天天搡| 中文字母永久播放1区2区3区| 亚洲日产av一区二区在线| 日本三极片视频网站观看| 特大黑人巨大xxxx| 视频二区在线视频观看| 亚洲免费成人a v| 国产一区成人在线观看视频| 亚洲欧美日韩视频免费观看| 激情五月婷婷免费视频| 在线观看视频污一区| 亚洲激情av一区二区| 日本一二三区不卡无| 亚洲欧美精品综合图片小说| 国产高清精品一区二区三区| 制丝袜业一区二区三区| 午夜福利资源综合激情午夜福利资| 啊啊好大好爽啊啊操我啊啊视频| 一个人免费在线观看ww视频| av在线观看网址av| 女生自摸在线观看一区二区三区 | 男生舔女生逼逼的视频| 中文字幕人妻三级在线观看| 欧美一区二区三区乱码在线播放| 欧美一区二区三区啪啪同性| 午夜场射精嗯嗯啊啊视频| 亚洲欧美国产麻豆综合| 伊人情人综合成人久久网小说 | 粉嫩av蜜乳av蜜臀| av老司机精品在线观看| 欧美伊人久久大香线蕉综合| 亚洲一区久久免费视频| av久久精品北条麻妃av观看| 亚洲一区av中文字幕在线观看| 熟女少妇激情五十路| 91九色porny蝌蚪国产成人| 午夜久久久久久久99| 四虎永久在线精品免费区二区| 在线国产精品一区二区三区| 亚洲最大黄了色网站| 日本女人一级免费片| 九九视频在线精品播放| 黄色男人的天堂视频| 人妻丝袜精品中文字幕| 亚洲av男人的天堂你懂的| 中文字幕,亚洲人妻| 最近中文2019年在线看| 欧美精产国品一二三区| 精品人妻伦一二三区久| 极品性荡少妇一区二区色欲| 亚洲 图片 欧美 图片| 成人av久久精品一区二区| 青青青青草手机在线视频免费看| 日本免费视频午夜福利视频| 粉嫩av蜜乳av蜜臀| 极品丝袜一区二区三区| 亚洲精品一区二区三区老狼| 日本在线不卡免费视频| 少妇高潮一区二区三区| 国产露脸对白在线观看| 欧美久久一区二区伊人| 免费观看成年人视频在线观看| 果冻传媒av一区二区三区| 青青草原色片网站在线观看| 日日夜夜大香蕉伊人| 秋霞午夜av福利经典影视| 五十路老熟女码av| 动色av一区二区三区| 伊人情人综合成人久久网小说| 果冻传媒av一区二区三区| 婷婷色中文亚洲网68| 黄色录像鸡巴插进去| 天堂v男人视频在线观看| 91 亚洲视频在线观看| 日本性感美女视频网站| 黑人解禁人妻叶爱071| 欧美爆乳肉感大码在线观看| 老司机午夜精品视频资源| 美女骚逼日出水来了| 9国产精品久久久久老师| 激情人妻校园春色亚洲欧美| 久久久人妻一区二区| 最新中文字幕免费视频| 5528327男人天堂| 天天综合天天综合天天网 | av手机免费在线观看高潮| 制服丝袜在线人妻中文字幕| 久久人人做人人妻人人玩精品vr| 天天色天天操天天透| 亚洲国际青青操综合网站| 在线观看国产网站资源| 久久永久免费精品人妻专区| 初美沙希中文字幕在线| 揄拍成人国产精品免费看视频| 最新的中文字幕 亚洲| 岛国免费大片在线观看| 青青青青青免费视频| 男生用鸡操女生视频动漫| 久久久麻豆精亚洲av麻花| 欧美女同性恋免费a| aⅴ五十路av熟女中出| 18禁网站一区二区三区四区| 色综合久久五月色婷婷综合| 亚洲免费va在线播放| 一级黄色片夫妻性生活| 91久久国产成人免费网站| 天天通天天透天天插| 香港三日本三韩国三欧美三级| 久久精品在线观看一区二区| 被大鸡吧操的好舒服视频免费| 91国产在线免费播放| 888欧美视频在线| 国产黄色片蝌蚪九色91| 福利片区一区二体验区| 2020av天堂网在线观看| 日日爽天天干夜夜操| 老鸭窝在线观看一区| 国产亚洲成人免费在线观看| 97国产在线观看高清| 中文字幕日韩人妻在线三区| 欧美特色aaa大片| 91精品啪在线免费| 国产精品黄大片在线播放| 欧美在线偷拍视频免费看| 中文字幕第三十八页久久| 熟女妇女老妇一二三区| 国产普通话插插视频| 午夜极品美女福利视频| 天天干天天插天天谢| 久久这里只有精彩视频免费| 日韩av有码一区二区三区4| 欧美viboss性丰满| 亚洲中文精品人人免费| 青青青青青青草国产| 偷拍自拍国产在线视频| 天天日天天日天天射天天干| 黄色的网站在线免费看| 4个黑人操素人视频网站精品91| 在线免费观看国产精品黄色| 婷婷综合蜜桃av在线| 亚洲一区久久免费视频| 亚洲精品久久综合久| 在线国产日韩欧美视频| 欧美美女人体视频一区| 日本一区二区三区免费小视频| 国产在线91观看免费观看| 久久久久五月天丁香社区| 亚洲熟女综合色一区二区三区四区 | 欧美80老妇人性视频| 欧美一区二区三区在线资源| 和邻居少妇愉情中文字幕| 亚洲欧美一区二区三区爱爱动图| 欧美地区一二三专区| 婷婷综合蜜桃av在线| 成人综合亚洲欧美一区| av完全免费在线观看av| 久草视频福利在线首页| 都市家庭人妻激情自拍视频| 91自产国产精品视频| 91麻豆精品91久久久久同性| 亚洲激情av一区二区| 青青青青爽手机在线| 午夜激情高清在线观看| 午夜久久久久久久精品熟女| 97人妻无码AV碰碰视频| aⅴ五十路av熟女中出| 欧美日本国产自视大全| 久草视频 久草视频2| 精品人妻每日一部精品| 亚洲最大黄了色网站| 久久艹在线观看视频| 在线播放国产黄色av| 精品高跟鞋丝袜一区二区| 欧美viboss性丰满| 99热国产精品666| 大骚逼91抽插出水视频| 少妇被强干到高潮视频在线观看| 中国黄片视频一区91| 国产亚洲视频在线二区| 在线免费观看黄页视频| 91中文字幕最新合集| 日韩人妻丝袜中文字幕| 在线免费观看亚洲精品电影| 激情国产小视频在线| 亚洲自拍偷拍精品网| chinese国产盗摄一区二区| 美女骚逼日出水来了| 欧美成人综合色在线噜噜| 性生活第二下硬不起来| 91传媒一区二区三区| 大尺度激情四射网站| 久久精品国产23696| 在线免费91激情四射 | 青青青青青手机视频| 欧美亚洲少妇福利视频| 人人超碰国字幕观看97| 欧美一区二区三区乱码在线播放 | 久久丁香花五月天色婷婷| 视频啪啪啪免费观看| 黑人进入丰满少妇视频| 免费大片在线观看视频网站| 日韩美女福利视频网| 成人av在线资源网站| 黄色片年轻人在线观看| 日本美女性生活一级片| 午夜在线一区二区免费| 亚洲精品无码久久久久不卡| 91免费放福利在线观看| 99精品国产aⅴ在线观看| 北条麻妃肉色丝袜视频| 亚洲偷自拍高清视频| 任我爽精品视频在线播放| 传媒在线播放国产精品一区| 日本乱人一区二区三区| 在线免费91激情四射| 亚洲av日韩高清hd| 激情啪啪啪啪一区二区三区| 狠狠嗨日韩综合久久| 男人操女人的逼免费视频| 天天日天天干天天干天天日| av天堂资源最新版在线看| 日本黄色三级高清视频| 蜜桃视频17c在线一区二区| 欧美男人大鸡吧插女人视频| 国产91嫩草久久成人在线视频| 久久久久久久精品成人热| 91av精品视频在线| 婷婷五月亚洲综合在线| 日韩午夜福利精品试看| 99热这里只有国产精品6| 国产熟妇乱妇熟色T区| 四川五十路熟女av| 亚洲自拍偷拍精品网| 91福利视频免费在线观看| 男人插女人视频网站| 免费在线福利小视频| 国产午夜无码福利在线看| 又黄又刺激的午夜小视频| 在线免费观看视频一二区| 啪啪啪操人视频在线播放| av中文字幕电影在线看| 国产精品视频资源在线播放| 大香蕉玖玖一区2区| 干逼又爽又黄又免费的视频| 激情五月婷婷综合色啪| 亚洲国产在线精品国偷产拍| 青青青青青免费视频| 欧美成人黄片一区二区三区| 青青青视频自偷自拍38碰| 黄色大片男人操女人逼| 大白屁股精品视频国产| 顶级尤物粉嫩小尤物网站| 国产女人被做到高潮免费视频| 在线视频国产欧美日韩| 99热这里只有精品中文| 亚洲日本一区二区三区| 国产精品欧美日韩区二区| 欧美中文字幕一区最新网址| 中文字幕人妻一区二区视频| 亚洲成人av一区久久| 亚洲高清国产一区二区三区| 亚洲精品一线二线在线观看| 99精品国产自在现线观看| 55夜色66夜色国产精品站| 亚洲国产40页第21页| 2o22av在线视频| 天天操天天操天天碰| 大香蕉日本伊人中文在线| 久久香蕉国产免费天天| 超碰在线中文字幕一区二区| 骚逼被大屌狂草视频免费看| 操人妻嗷嗷叫视频一区二区| 88成人免费av网站| 黑人巨大的吊bdsm| 久久久精品999精品日本| 丰满的继坶3中文在线观看| 日韩欧美高清免费在线| 真实国模和老外性视频| 人人人妻人人澡人人| 中文字幕免费福利视频6| 在线观看av2025| 黄色资源视频网站日韩| 成人高潮aa毛片免费| 精品久久婷婷免费视频| 国产午夜亚洲精品麻豆| av在线播放国产不卡| 中文字幕乱码人妻电影| aⅴ精产国品一二三产品| 自拍偷拍一区二区三区图片| 婷婷五月亚洲综合在线| 国产精品自拍视频大全| 777奇米久久精品一区| 天美传媒mv视频在线观看| 日比视频老公慢点好舒服啊| 天天日天天做天天日天天做| 欧洲国产成人精品91铁牛tv| 亚洲av日韩av网站| 人妻凌辱欧美丰满熟妇| av手机在线免费观看日韩av| 91av精品视频在线| 欧美亚洲免费视频观看| 狠狠地躁夜夜躁日日躁| 在线亚洲天堂色播av电影| 5528327男人天堂| 91超碰青青中文字幕| 老司机福利精品免费视频一区二区 | 欧美视频综合第一页| 开心 色 六月 婷婷| 九一传媒制片厂视频在线免费观看| 91超碰青青中文字幕| 亚洲 欧美 自拍 偷拍 在线| 免费看美女脱光衣服的视频| 在线观看免费视频网| 欧美激情电影免费在线| 日曰摸日日碰夜夜爽歪歪| 日韩欧美国产一区不卡| 亚洲人妻av毛片在线| 精品黑人巨大在线一区| 亚洲一区二区久久久人妻| 中文字幕乱码人妻电影| 老司机你懂得福利视频| 大尺度激情四射网站| 18禁美女黄网站色大片下载| 深田咏美亚洲一区二区| 视频二区在线视频观看| 日韩av中文在线免费观看| 精品一区二区三区欧美| 中国无遮挡白丝袜二区精品| 特黄老太婆aa毛毛片| av网址在线播放大全| 在线播放 日韩 av| eeuss鲁片一区二区三区| 日韩欧美国产一区不卡| 绝顶痉挛大潮喷高潮无码| 91一区精品在线观看| 久久香蕉国产免费天天| 老司机深夜免费福利视频在线观看| 国产janese在线播放| 亚洲在线一区二区欧美| 天天干天天啪天天舔| 自拍偷拍日韩欧美一区二区| 国产密臀av一区二区三| 亚洲最大黄了色网站| 中文字幕高清资源站| av新中文天堂在线网址| 色秀欧美视频第一页| 免费黄页网站4188| 欧美特色aaa大片| 中国把吊插入阴蒂的视频| 岛国黄色大片在线观看| 传媒在线播放国产精品一区| av手机免费在线观看高潮| 2021最新热播中文字幕| 欧美精品伦理三区四区| 久久久久久久亚洲午夜综合福利| 黄片三级三级三级在线观看| 成人30分钟免费视频| 成人伊人精品色xxxx视频| 国产大学生援交正在播放| 岛国毛片视频免费在线观看| 亚洲成人午夜电影在线观看 | 91国内精品自线在拍白富美| 大屁股熟女一区二区三区| 亚洲精品午夜久久久久| 亚洲免费va在线播放| 黄色视频成年人免费观看| 婷婷午夜国产精品久久久| 青青青青青青青青青青草青青| 2022精品久久久久久中文字幕| 2020久久躁狠狠躁夜夜躁| 免费十精品十国产网站| 爆乳骚货内射骚货内射在线| 欧美性感尤物人妻在线免费看| 亚洲人妻国产精品综合| 国产精品国产三级麻豆| 国产视频在线视频播放| 播放日本一区二区三区电影| 老司机福利精品免费视频一区二区 | 成人高清在线观看视频| 神马午夜在线观看视频| 嫩草aⅴ一区二区三区| 中文字幕 码 在线视频| 社区自拍揄拍尻屁你懂的| 欧美视频一区免费在线| 久久这里有免费精品| 在线观看视频网站麻豆| 亚洲中文字幕综合小综合| 国产精彩福利精品视频| 亚洲免费av在线视频| 亚洲av天堂在线播放| 91天堂精品一区二区| 精品久久久久久高潮| 亚洲天堂av最新网址| 91高清成人在线视频| 丰满熟女午夜福利视频| 亚洲日本一区二区三区| 99国产精品窥熟女精品| 人妻熟女中文字幕aⅴ在线| 国产性生活中老年人视频网站| 狠狠躁夜夜躁人人爽天天天天97| 2020韩国午夜女主播在线| 一级黄色片夫妻性生活| 中文字幕乱码av资源| 亚洲中文精品字幕在线观看 | 国产大学生援交正在播放| 亚洲综合另类精品小说| 丰满少妇翘臀后进式| 极品丝袜一区二区三区| 38av一区二区三区| 国产密臀av一区二区三| 在线播放一区二区三区Av无码| 天天干天天操天天玩天天射 | 熟女俱乐部一二三区| 99热这里只有精品中文| 美女福利写真在线观看视频| 男女啪啪视频免费在线观看| 黄色中文字幕在线播放| 91精品高清一区二区三区| 久久精品国产23696| 大香蕉日本伊人中文在线| 韩国一级特黄大片做受| 国产福利小视频免费观看| 爱爱免费在线观看视频| 岛国免费大片在线观看| 国产无遮挡裸体免费直播视频| 亚洲福利精品福利精品福利| 国产福利小视频大全| 一区二区在线视频中文字幕| 在线观看视频一区麻豆| 888亚洲欧美国产va在线播放| 国产性色生活片毛片春晓精品 | 57pao国产一区二区| 国产精选一区在线播放| 成年人黄色片免费网站| 亚洲av色图18p| 精品一区二区三区在线观看| 狠狠操狠狠操免费视频| 国产女孩喷水在线观看| 久碰精品少妇中文字幕av | 成人H精品动漫在线无码播放| 日本xx片在线观看| 粗大的内捧猛烈进出爽大牛汉子| 蜜臀av久久久久久久| 超pen在线观看视频公开97| 男女啪啪视频免费在线观看 | 成人av久久精品一区二区| 丝袜美腿欧美另类 中文字幕| 97精品综合久久在线| 国产一级麻豆精品免费| 2019av在线视频| 国产密臀av一区二区三| 国产性感美女福利视频| 中文字幕在线视频一区二区三区| 中国无遮挡白丝袜二区精品| 国产露脸对白在线观看| 99精品视频之69精品视频 | 黑人进入丰满少妇视频| 97超碰免费在线视频| 国产亚洲欧美视频网站| 大尺度激情四射网站| av在线免费中文字幕| 自拍偷拍亚洲另类色图| 在线观看黄色成年人网站| www天堂在线久久| 99精品免费久久久久久久久a| 天天操天天弄天天射| 亚洲精品 日韩电影| 久久精品国产亚洲精品166m| av森泽佳奈在线观看| 97国产在线观看高清| 天天操天天污天天射| 55夜色66夜色国产精品站| 欧洲精品第一页欧洲精品亚洲| 中文字幕+中文字幕| 成人av中文字幕一区| 女蜜桃臀紧身瑜伽裤 | 国产精品成人xxxx| 国产在线91观看免费观看| 日比视频老公慢点好舒服啊| 婷婷五月亚洲综合在线| 蜜桃久久久久久久人妻| 97人人模人人爽人人喊| 欧美一区二区三区高清不卡tv | 久久久久久久久久一区二区三区| 伊人开心婷婷国产av| 一区二区在线视频中文字幕| 伊拉克及约旦宣布关闭领空| 日本www中文字幕| 韩国一级特黄大片做受| 91精品国产观看免费| 黄色成人在线中文字幕| 国产精品自拍在线视频| 黄色大片免费观看网站| 天天干夜夜操天天舔| av老司机亚洲一区二区| 中文字幕成人日韩欧美| 日韩不卡中文在线视频网站| 夜夜操,天天操,狠狠操| 午夜青青草原网在线观看| 午夜青青草原网在线观看| 五月色婷婷综合开心网4438| 日本一二三中文字幕| 亚洲熟女久久久36d| 国产精品国产精品一区二区| 污污小视频91在线观看| 亚洲粉嫩av一区二区三区| 搞黄色在线免费观看| 亚洲国产精品中文字幕网站| 国产高清精品极品美女| 小泽玛利亚视频在线观看| 男人天堂最新地址av| 老司机免费视频网站在线看| 操操网操操伊剧情片中文字幕网| 免费成人av中文字幕| 欧美偷拍自拍色图片| 91在线免费观看成人| 91色九色porny| 亚洲一区自拍高清免费视频| 懂色av之国产精品| 日日夜夜大香蕉伊人| 人妻熟女中文字幕aⅴ在线| 亚洲免费视频欧洲免费视频| 非洲黑人一级特黄片| 熟女人妻一区二区精品视频| 日本少妇的秘密免费视频| 青青青青爽手机在线| 91欧美在线免费观看| 首之国产AV医生和护士小芳| 在线观看国产网站资源| 天天做天天干天天操天天射| 免费观看理论片完整版| 一区二区三区欧美日韩高清播放| 免费无码人妻日韩精品一区二区| 伊人日日日草夜夜草| 一区二区三区视频,福利一区二区| 中文字幕午夜免费福利视频| 大鸡八强奸视频在线观看| 国产高清女主播在线| 夏目彩春在线中文字幕| 亚洲欧美成人综合视频| 亚洲在线观看中文字幕av| 天天日天天敢天天干| 一级A一级a爰片免费免会员| 伊人精品福利综合导航| 亚洲国产成人无码麻豆艾秋| 99热国产精品666| 最新国产亚洲精品中文在线| 成人精品在线观看视频| 日本美女成人在线视频| 日本少妇人妻xxxxx18| 六月婷婷激情一区二区三区| 亚洲成a人片777777| 综合色区亚洲熟妇shxstz| 国产成人午夜精品福利| 国产伦精品一区二区三区竹菊| 久久久91蜜桃精品ad| 爱有来生高清在线中文字幕| 亚洲精品色在线观看视频| 老司机福利精品视频在线| 性感美女福利视频网站| 日本黄色三级高清视频| 成人精品在线观看视频| 99久久激情婷婷综合五月天| 久久久久久cao我的性感人妻| 揄拍成人国产精品免费看视频| 日韩不卡中文在线视频网站| 毛片av在线免费看| 亚洲av琪琪男人的天堂| 成人av天堂丝袜在线观看| 日本18禁久久久久久| 午夜国产免费福利av| 日韩欧美国产一区不卡| 午夜激情精品福利视频| 亚洲图片欧美校园春色| 91久久精品色伊人6882| 精品视频一区二区三区四区五区| 青青青艹视频在线观看| 欧美在线偷拍视频免费看| 欧美精品中文字幕久久二区| 偷偷玩弄新婚人妻h视频| 91九色porny国产在线| 国产精品国产三级国产精东 | 欧美第一页在线免费观看视频| 2o22av在线视频| 成人资源在线观看免费官网 | 最新97国产在线视频| 97人人模人人爽人人喊| 美女日逼视频免费观看| 97青青青手机在线视频| 在线观看成人国产电影| 哥哥姐姐综合激情小说| 国产精彩对白一区二区三区| 9色在线视频免费观看| 人妻少妇亚洲一区二区| 狠狠鲁狠狠操天天晚上干干| 社区自拍揄拍尻屁你懂的| 都市激情校园春色狠狠| 99热99re在线播放| 动漫黑丝美女的鸡巴| 日本黄色三级高清视频| 色秀欧美视频第一页| 成人综合亚洲欧美一区| 一区二区视频视频视频| 最新激情中文字幕视频| 亚洲美女美妇久久字幕组| 亚洲天堂有码中文字幕视频| 91久久国产成人免费网站| av大全在线播放免费| 欧美第一页在线免费观看视频| 最近中文字幕国产在线| 中文字幕—97超碰网| 国产免费高清视频视频| 男人的天堂在线黄色| 国产九色91在线视频| 岛国一区二区三区视频在线| 91色秘乱一区二区三区| 搡老熟女一区二区在线观看| 熟女人妻一区二区精品视频| 国产av国片精品一区二区| 91chinese在线视频| 国产成人精品亚洲男人的天堂| 日日夜夜狠狠干视频| 国产高清97在线观看视频| 韩国AV无码不卡在线播放| 日韩精品二区一区久久| 人妻丝袜诱惑我操她视频| 视频久久久久久久人妻| 操操网操操伊剧情片中文字幕网| 亚洲护士一区二区三区| 欧美精品国产综合久久| 一色桃子人妻一区二区三区| 男人和女人激情视频| 韩国AV无码不卡在线播放| 日本www中文字幕| 欧美日韩高清午夜蜜桃大香蕉| 日韩三级电影华丽的外出| 亚洲精品av在线观看| 午夜精品亚洲精品五月色| 美女av色播在线播放| 五十路丰满人妻熟妇| 黑人进入丰满少妇视频| 1区2区3区4区视频在线观看| 蜜桃专区一区二区在线观看| 中文 成人 在线 视频| 亚洲一区二区激情在线| 动色av一区二区三区| 欧美精品资源在线观看| 国产福利在线视频一区| 日本韩国免费一区二区三区视频| 精品久久久久久高潮| 中文字幕日本人妻中出| 经典国语激情内射视频| 91香蕉成人app下载| 国产欧美日韩在线观看不卡| 九色porny九色9l自拍视频| 99久久99一区二区三区| 熟女人妻三十路四十路人妻斩| 亚洲码av无色中文| 人妻丝袜诱惑我操她视频| 日韩a级黄色小视频| 欧美偷拍自拍色图片| 久久久久久九九99精品| 精品成人午夜免费看| 青青青爽视频在线播放| 韩国亚洲欧美超一级在线播放视频| 丰满的子国产在线观看| 91九色国产porny蝌蚪| 美女福利写真在线观看视频| 日本高清撒尿pissing| 国产综合精品久久久久蜜臀| 亚洲欧美人精品高清| 亚洲av色香蕉一区二区三区| 欧亚乱色一区二区三区| 亚洲熟色妇av日韩熟色妇在线| 社区自拍揄拍尻屁你懂的| 激情啪啪啪啪一区二区三区| 国产女人被做到高潮免费视频| 99人妻视频免费在线| 色在线观看视频免费的| 在线免费视频 自拍| 喷水视频在线观看这里只有精品| 熟妇一区二区三区高清版| 亚洲欧美激情国产综合久久久| 97成人免费在线观看网站| 亚洲高清国产自产av| 蜜臀av久久久久久久| 在线观看的a站 最新| 人人人妻人人澡人人| 玩弄人妻熟妇性色av少妇| 欧美偷拍自拍色图片| 手机看片福利盒子日韩在线播放| 国产成人自拍视频在线免费观看| 青青青青青青青青青国产精品视频| 日曰摸日日碰夜夜爽歪歪| 黄色视频在线观看高清无码 | 中文字幕+中文字幕| 一区二区三区四区五区性感视频| 视频在线免费观看你懂得| 一区二区三区四区中文| 在线观看av亚洲情色| 中文字幕在线乱码一区二区 | 777奇米久久精品一区| 国产精品伦理片一区二区| 国产精品3p和黑人大战| 狠狠鲁狠狠操天天晚上干干| 国产美女午夜福利久久| 欧美精品资源在线观看| 日日夜夜大香蕉伊人| 自拍偷拍vs一区二区三区| 边摸边做超爽毛片18禁色戒| 黑人巨大的吊bdsm| 国产麻豆剧传媒精品国产av蜜桃 | 午夜在线精品偷拍一区二| 唐人色亚洲av嫩草| 亚洲午夜高清在线观看| 精品成人啪啪18免费蜜臀| 在线观看视频一区麻豆| 人妻少妇中文有码精品| 国产高清精品一区二区三区| 人妻另类专区欧美制服| 91人妻人人做人人爽在线| 男人天堂av天天操| 国产一区二区三免费视频| 亚洲熟色妇av日韩熟色妇在线| 操操网操操伊剧情片中文字幕网| 午夜福利人人妻人人澡人人爽| 偷拍自拍福利视频在线观看| 日本精品一区二区三区在线视频。| 亚洲国产欧美国产综合在线| 久草电影免费在线观看| 午夜福利资源综合激情午夜福利资| 欧美女同性恋免费a| 天天躁日日躁狠狠躁躁欧美av| 美女张开腿让男生操在线看| 天天摸天天干天天操科普| 大肉大捧一进一出好爽在线视频| 一区二区视频在线观看视频在线| 亚洲成人av一区在线| 亚洲精品无码久久久久不卡| 亚洲天堂精品久久久| 天天日天天日天天射天天干| 婷婷综合亚洲爱久久| 在线视频国产欧美日韩| 69精品视频一区二区在线观看| 最新日韩av传媒在线| 国产成人精品福利短视频| 国产精品久久久久久久女人18| 天天艹天天干天天操| 中文字幕亚洲中文字幕| 成人精品在线观看视频| 99婷婷在线观看视频| 日本人妻精品久久久久久| 精品视频中文字幕在线播放 | 一区二区三区日本伦理| 性色蜜臀av一区二区三区| 欧美乱妇无乱码一区二区| 国产之丝袜脚在线一区二区三区| 美女操逼免费短视频下载链接| 大鸡巴插入美女黑黑的阴毛| 99re久久这里都是精品视频| 少妇ww搡性bbb91| 在线亚洲天堂色播av电影| 欧美男人大鸡吧插女人视频| 精彩视频99免费在线| 东京热男人的av天堂| 999九九久久久精品| 黄色资源视频网站日韩| 久久久久久cao我的性感人妻| 99re国产在线精品| 91天堂天天日天天操| 最新激情中文字幕视频| 亚洲另类伦春色综合小| 中文字幕在线乱码一区二区| japanese日本熟妇另类| 久久热久久视频在线观看| 污污小视频91在线观看| 天天操天天干天天日狠狠插| 国产一区二区在线欧美| 亚洲另类在线免费观看| 熟女视频一区,二区,三区| 亚洲日本一区二区久久久精品| 久久久久久性虐视频| 女警官打开双腿沦为性奴| 免费人成黄页网站在线观看国产| 91香蕉成人app下载| 国产午夜无码福利在线看| 亚洲免费视频欧洲免费视频| 国产自拍在线观看成人| 黄色视频成年人免费观看| 在线视频自拍第三页| 欧美国品一二三产区区别| 亚洲欧洲一区二区在线观看| 国产精品自偷自拍啪啪啪| 免费黄页网站4188| 国内精品在线播放第一页| 亚洲av日韩av第一区二区三区| 亚洲成高清a人片在线观看| 中文字幕在线观看国产片| 日韩在线中文字幕色| 乱亲女秽乱长久久久| 欧美激情电影免费在线| 狠狠地躁夜夜躁日日躁| 黄色片一级美女黄色片| 国产伦精品一区二区三区竹菊| 在线观看黄色成年人网站| 青青操免费日综合视频观看| 国产一区二区在线欧美| 国产午夜福利av导航| 一区二区麻豆传媒黄片| 精品美女久久久久久| 综合激情网激情五月五月婷婷| 国产在线观看黄色视频| 国产日韩一区二区在线看 | 五十路在线观看完整版| 久久尻中国美女视频| 亚洲一区二区三区精品视频在线| 91人妻精品一区二区久久| 啪啪啪啪啪啪啪啪啪啪黄色| 最新的中文字幕 亚洲| 任你操任你干精品在线视频| 天天操夜夜骑日日摸| 日韩人妻xxxxx| 亚洲人妻国产精品综合| 国内自拍第一页在线观看| 国产第一美女一区二区三区四区 | 亚洲va国产va欧美精品88| 国产一区二区久久久裸臀| 黄色av网站免费在线| 丰满的子国产在线观看| 婷婷久久久久深爱网| aⅴ精产国品一二三产品| 男人天堂最新地址av| 国产V亚洲V天堂无码欠欠| 天天干天天操天天爽天天摸| 人妻激情图片视频小说| 亚洲精品ww久久久久久| 丝袜肉丝一区二区三区四区在线| 激情色图一区二区三区| 1区2区3区不卡视频| 亚洲精品成人网久久久久久小说 | 亚欧在线视频你懂的| 亚洲精品无码久久久久不卡| 亚洲精品国品乱码久久久久| 人妻少妇精品久久久久久| 亚洲码av无色中文| 国产之丝袜脚在线一区二区三区 | 老司机99精品视频在线观看| 国产精品视频欧美一区二区| 青青青aaaa免费| 午夜成午夜成年片在线观看| 女人精品内射国产99| 亚洲 中文字幕在线 日韩| 欧美伊人久久大香线蕉综合| 天天日天天爽天天干| 香蕉91一区二区三区| 午夜精品一区二区三区福利视频| 国产精品探花熟女在线观看| 91传媒一区二区三区| 女警官打开双腿沦为性奴| 国产卡一卡二卡三乱码手机| 日韩精品一区二区三区在线播放| 精品黑人一区二区三区久久国产| 深夜男人福利在线观看| 日韩美av高清在线| 成人av在线资源网站| 黄片色呦呦视频免费看| 久久尻中国美女视频| 欧洲日韩亚洲一区二区三区| 任你操视频免费在线观看| 国产第一美女一区二区三区四区| 91精品啪在线免费| 在线免费观看日本片| 日韩中文字幕福利av| 在线成人日韩av电影| 日本人妻少妇18—xx| 护士小嫩嫩又紧又爽20p| 国产伊人免费在线播放| 777奇米久久精品一区| 免费手机黄页网址大全| 国产三级片久久久久久久| 老司机午夜精品视频资源| 亚洲一区二区激情在线| 天天日天天爽天天爽| 98精产国品一二三产区区别| 精品人妻伦一二三区久 | 4个黑人操素人视频网站精品91| 不戴胸罩引我诱的隔壁的人妻| 日本人妻欲求不满中文字幕| 天天日天天日天天射天天干| 中文字幕 码 在线视频| 亚洲天堂精品福利成人av| 亚洲 欧美 自拍 偷拍 在线| 真实国模和老外性视频| 福利视频一区二区三区筱慧| 大鸡巴操b视频在线| 在线免费观看黄页视频| 亚洲av自拍天堂网| 91超碰青青中文字幕| 精品一区二区三区在线观看| 日韩伦理短片在线观看| 久久久极品久久蜜桃| 动漫黑丝美女的鸡巴| 亚洲一区二区三区偷拍女厕91| 人妻凌辱欧美丰满熟妇| 在线国产日韩欧美视频| 99热碰碰热精品a中文| 亚洲va国产va欧美va在线| 老有所依在线观看完整版| 中文字母永久播放1区2区3区| 欧美黄色录像免费看的| 偷青青国产精品青青在线观看| 中文字幕AV在线免费看 | 懂色av之国产精品| 精品91自产拍在线观看一区| av在线免费资源站| 国产日韩欧美视频在线导航| 香港一级特黄大片在线播放| 天天摸天天干天天操科普| 国产精品视频男人的天堂| 黄色成人在线中文字幕| 女警官打开双腿沦为性奴| 青青青青青手机视频| 夜夜嗨av一区二区三区中文字幕| 把腿张开让我插进去视频| 韩国男女黄色在线观看| 懂色av蜜桃a v| 宅男噜噜噜666免费观看| 亚洲一区二区三区久久午夜 | 国产精品黄色的av| 久久精品美女免费视频| 亚洲成a人片777777| 国产真实乱子伦a视频 | 天天干天天爱天天色| 亚洲午夜福利中文乱码字幕| 都市激情校园春色狠狠| 色秀欧美视频第一页| 精品久久久久久久久久中文蒉| 亚洲av无硬久久精品蜜桃| 美女大bxxxx内射| 国产精品精品精品999| 2020中文字幕在线播放| 国产黄网站在线观看播放| 五十路老熟女码av| 韩国女主播精品视频网站| 日本午夜久久女同精女女| 欧美黑人巨大性xxxxx猛交| 久草极品美女视频在线观看| 成年美女黄网站18禁久久| 成人24小时免费视频| 97少妇精品在线观看| 亚洲国产40页第21页| 亚洲精品色在线观看视频| 国产大鸡巴大鸡巴操小骚逼小骚逼| 91超碰青青中文字幕| 亚洲av男人的天堂你懂的| 日本特级片中文字幕| av在线免费中文字幕| 成人精品在线观看视频| 国产精品成久久久久三级蜜臀av | 少妇被强干到高潮视频在线观看| 91精品综合久久久久3d动漫| 亚洲福利天堂久久久久久| 国产精品人久久久久久| 91精品激情五月婷婷在线| 国产熟妇一区二区三区av | 宅男噜噜噜666国产| 日本人妻欲求不满中文字幕| 青青社区2国产视频| 91 亚洲视频在线观看| 日本性感美女写真视频| 日韩加勒比东京热二区| 青青在线视频性感少妇和隔壁黑丝| 午夜精彩视频免费一区| 国产熟妇一区二区三区av | 巨乳人妻日下部加奈被邻居中出 | 亚洲精品久久视频婷婷| 天天干夜夜操天天舔| 亚洲av男人天堂久久| 国产乱弄免费视频观看| 狠狠躁狠狠爱网站视频| 最新97国产在线视频| 天天躁日日躁狠狠躁躁欧美av| 亚洲人妻视频在线网| 国产97在线视频观看| 99国内小视频在现欢看| 精品久久久久久久久久久久人妻| 国产亚洲视频在线观看| 亚洲人妻30pwc| 全国亚洲男人的天堂| 一区二区视频视频视频| 亚洲高清国产自产av| 黄色无码鸡吧操逼视频| 五色婷婷综合狠狠爱| 美味人妻2在线播放| 国产精品久久9999| 欧洲黄页网免费观看| 欧美视频一区免费在线| 欧美成人综合色在线噜噜| 日韩精品一区二区三区在线播放| 高潮视频在线快速观看国家快速| 75国产综合在线视频| 久久久极品久久蜜桃| 中文字幕人妻熟女在线电影| 337p日本大胆欧美人| 在线新三级黄伊人网| av新中文天堂在线网址| 人妻丝袜榨强中文字幕| 丝袜肉丝一区二区三区四区在线看| 亚洲最大免费在线观看| 91自产国产精品视频| free性日本少妇| 18禁美女黄网站色大片下载| 在线亚洲天堂色播av电影| 中文字幕在线视频一区二区三区| 特黄老太婆aa毛毛片| 天天操天天干天天日狠狠插| 免费大片在线观看视频网站| 人人妻人人澡欧美91精品| 成人av天堂丝袜在线观看| 午夜免费体验区在线观看| 一二三中文乱码亚洲乱码one| 福利一二三在线视频观看| 国产精品欧美日韩区二区| www骚国产精品视频| 青草青永久在线视频18| 在线亚洲天堂色播av电影| 国产熟妇一区二区三区av | 在线不卡成人黄色精品| 五色婷婷综合狠狠爱| 亚洲日产av一区二区在线| 日本美女性生活一级片| av大全在线播放免费| 国产又粗又硬又大视频| av俺也去在线播放| av在线免费中文字幕| 日本韩国免费福利精品| 午夜成午夜成年片在线观看| 国产亚洲四十路五十路| 1024久久国产精品| 亚洲av午夜免费观看| 老司机在线精品福利视频| 日韩无码国产精品强奸乱伦| 日本一区美女福利视频| 加勒比视频在线免费观看| 国产视频网站国产视频| 国产不卡av在线免费| 欧美中国日韩久久精品| av老司机精品在线观看| 国产亚洲四十路五十路| 亚洲精品乱码久久久本| 蜜桃精品久久久一区二区| av在线免费资源站| 欧美国品一二三产区区别| 天天日天天摸天天爱| 最新国产精品拍在线观看| 五十路老熟女码av| 天天日天天玩天天摸| 小泽玛利亚视频在线观看| 91人妻精品久久久久久久网站 | 成人免费毛片aaaa| 98视频精品在线观看| 日韩欧美国产一区ab| 岛国av高清在线成人在线| 香港一级特黄大片在线播放| 沈阳熟妇28厘米大战黑人| 亚洲人妻视频在线网| 天天色天天操天天舔| 天天日天天干天天搡| 一个色综合男人天堂| 午夜精品九一唐人麻豆嫩草成人| 天天日天天操天天摸天天舔| 国产欧美精品免费观看视频| 黄页网视频在线免费观看| 女同性ⅹxx女同h偷拍| 国产一级精品综合av| 中文字幕AV在线免费看 | weyvv5国产成人精品的视频| 成人色综合中文字幕| 超碰在线中文字幕一区二区| 伊人成人在线综合网| 99精品一区二区三区的区| 快插进小逼里大鸡吧视频| 美女吃鸡巴操逼高潮视频| 99精品久久久久久久91蜜桃| 日韩欧美一级精品在线观看| 91成人在线观看免费视频| 久草视频中文字幕在线观看| 中文字幕第一页国产在线| 日本精品美女在线观看| 日本美女成人在线视频| 国产之丝袜脚在线一区二区三区| 绝顶痉挛大潮喷高潮无码 | 日日操夜夜撸天天干| 亚洲成人av在线一区二区| 国产自拍在线观看成人| 亚洲中文字幕国产日韩| 亚洲视频乱码在线观看| av中文字幕在线观看第三页| 啪啪啪18禁一区二区三区| 人妻激情图片视频小说| 都市激情校园春色狠狠| 色哟哟国产精品入口| 天天日夜夜操天天摸| 五十路在线观看完整版| 国产精品系列在线观看一区二区 | 国产精品亚洲在线观看| 大学生A级毛片免费视频| 中文字幕一区二区三区人妻大片| 久久免费看少妇高潮完整版| 国产乱子伦一二三区| 91久久精品色伊人6882| 香蕉片在线观看av| 制服丝袜在线人妻中文字幕| 偷拍美女一区二区三区| 91香蕉成人app下载| 同居了嫂子在线播高清中文| 绯色av蜜臀vs少妇| 全国亚洲男人的天堂| 天天干天天插天天谢| 骚货自慰被发现爆操| 欧美精品免费aaaaaa| 人人在线视频一区二区| 亚洲久久午夜av一区二区| 97人人妻人人澡人人爽人人精品| 天堂av在线播放免费| 久久久久久99国产精品| 欧美中国日韩久久精品| 亚洲一区制服丝袜美腿| 国产白袜脚足J棉袜在线观看| 91亚洲手机在线视频播放| 日本五十路熟新垣里子| 天天操天天插天天色| 曰本无码人妻丰满熟妇啪啪| 中文字幕亚洲久久久| 日韩伦理短片在线观看| 久久免看30视频口爆视频| 熟女少妇激情五十路| 国产黄色a级三级三级三级| 成年人午夜黄片视频资源| 国产日本精品久久久久久久| 97a片免费在线观看| 亚洲美女高潮喷浆视频| 久草视频在线免播放| 2021久久免费视频| 国产大学生援交正在播放| 天天操夜夜骑日日摸| 100%美女蜜桃视频| 亚洲人一区二区中文字幕| 久久精品视频一区二区三区四区| 亚洲国产免费av一区二区三区| 午夜福利资源综合激情午夜福利资| 精品首页在线观看视频| 91成人在线观看免费视频| 视频久久久久久久人妻| 宅男噜噜噜666免费观看| 欧美日韩亚洲国产无线码| 91亚洲国产成人精品性色| 国产精品免费不卡av| 91久久国产成人免费网站| 97国产福利小视频合集| 亚洲熟妇久久无码精品| 性感美女诱惑福利视频| 又粗又硬又猛又黄免费30| 五十路息与子猛烈交尾视频| 欧美aa一级一区三区四区 | 国产又粗又硬又猛的毛片视频| 成人资源在线观看免费官网| 3344免费偷拍视频| 亚洲在线一区二区欧美| 人人超碰国字幕观看97| 二区中出在线观看老师| 国产午夜亚洲精品不卡在线观看 | 综合激情网激情五月五月婷婷| 无码国产精品一区二区高潮久久4| 国产第一美女一区二区三区四区 | 天天操天天干天天日狠狠插| 亚洲熟妇久久无码精品| 午夜久久香蕉电影网| 欧美日韩情色在线观看| 中文字幕乱码人妻电影| 日本黄在免费看视频| 免费手机黄页网址大全| 亚洲精品午夜aaa久久| 亚洲免费在线视频网站| 自拍偷拍 国产资源| 中国视频一区二区三区| 久久精品亚洲成在人线a| 中文字幕日本人妻中出| 亚洲欧美自拍另类图片| 清纯美女在线观看国产| 久久精品国产999| 粉嫩av懂色av蜜臀av| 粉嫩欧美美人妻小视频| 操的小逼流水的文章| 国产亚洲欧美另类在线观看| 欧美精品亚洲精品日韩在线| 天堂av在线官网中文| 九一传媒制片厂视频在线免费观看 | 人妻熟女中文字幕aⅴ在线| 久久久久久性虐视频| 成人免费做爰高潮视频| 亚洲欧美精品综合图片小说| 国产女人露脸高潮对白视频| 日曰摸日日碰夜夜爽歪歪| 99热99这里精品6国产| mm131美女午夜爽爽爽| 做爰视频毛片下载蜜桃视频1| 免费费一级特黄真人片| 免费国产性生活视频| 亚洲蜜臀av一区二区三区九色| 黄色资源视频网站日韩| huangse网站在线观看| 天天干天天操天天扣| 日韩精品二区一区久久| 偷拍自拍亚洲美腿丝袜| 日本人妻少妇18—xx| 国产又粗又黄又硬又爽| 精品乱子伦一区二区三区免费播| 狠狠躁夜夜躁人人爽天天久天啪| 男人的天堂在线黄色| 国产九色91在线观看精品| 免费十精品十国产网站| 五月天久久激情视频| av在线播放国产不卡| 欧美黑人性猛交xxxxⅹooo| 宅男噜噜噜666免费观看| 精品一区二区三区午夜| 在线免费91激情四射| 大香蕉大香蕉在线有码 av| 国产欧美日韩第三页| www天堂在线久久| 视频啪啪啪免费观看| 午夜影院在线观看视频羞羞羞| 免费看国产又粗又猛又爽又黄视频| 黑人乱偷人妻中文字幕| 一区二区视频在线观看视频在线| 中文字幕av男人天堂| 精品人妻一二三区久久| 少妇人妻久久久久视频黄片| 中出中文字幕在线观看| japanese日本熟妇另类| 亚洲成av人无码不卡影片一| 999热精品视频在线| 国产精品日韩欧美一区二区| 欧美精品一二三视频| 中文字幕在线一区精品| 亚洲综合自拍视频一区| 最新中文字幕免费视频| 天天日天天干天天舔天天射| 老司机福利精品视频在线| 精品区一区二区三区四区人妻 | 自拍偷拍,中文字幕| 青青青国产片免费观看视频| 在线 中文字幕 一区| 韩国黄色一级二级三级| 在线观看国产网站资源| 久久精品视频一区二区三区四区 | 国产高清在线观看1区2区| 嫩草aⅴ一区二区三区| 亚洲国产在人线放午夜| 亚洲 图片 欧美 图片| 亚洲 欧美 精品 激情 偷拍 | 丝袜肉丝一区二区三区四区在线| 黄色男人的天堂视频| 人人超碰国字幕观看97| 国产97在线视频观看| 瑟瑟视频在线观看免费视频| 精品91自产拍在线观看一区| 中文字幕 亚洲av| 三级等保密码要求条款| 大白屁股精品视频国产| ka0ri在线视频| 最近中文2019年在线看| 色97视频在线播放| 丝袜美腿视频诱惑亚洲无| 青娱乐蜜桃臀av色| 9l人妻人人爽人人爽| 成人免费公开视频无毒| 天天干天天插天天谢| 天天干天天啪天天舔| 超碰中文字幕免费观看| 涩爱综合久久五月蜜臀| 男人插女人视频网站| 亚洲国产第一页在线观看| 亚洲一区二区三区久久午夜| 91大神福利视频网| 播放日本一区二区三区电影| 精品av国产一区二区三区四区| 精品久久久久久久久久中文蒉| 中文字幕人妻三级在线观看| 精品亚洲中文字幕av| 国产精品久久9999| 欧美精品中文字幕久久二区| 亚洲在线一区二区欧美| 精品久久久久久久久久久久人妻| 性感美女福利视频网站| 1000部国产精品成人观看视频| 黄色片黄色片wyaa| 1000部国产精品成人观看视频 | 人妻少妇中文有码精品| 精品黑人巨大在线一区| 国产揄拍高清国内精品对白| 在线网站你懂得老司机| 国产黄色大片在线免费播放 | 亚洲国际青青操综合网站| 国产一区二区神马久久| 午夜精品亚洲精品五月色| 青青青aaaa免费| 亚洲国产免费av一区二区三区| 午夜福利人人妻人人澡人人爽| 欧美亚洲中文字幕一区二区三区| 中文字幕高清在线免费播放 | 久草视频在线看免费| 久久综合老鸭窝色综合久久| 一级黄色av在线观看| 色呦呦视频在线观看视频| 无码国产精品一区二区高潮久久4| 人妻3p真实偷拍一二区| 午夜精品在线视频一区| 日本午夜爽爽爽爽爽视频在线观看 | 日本少妇人妻xxxxxhd| 老熟妇xxxhd老熟女| 日韩视频一区二区免费观看| 五月天色婷婷在线观看视频免费| av手机免费在线观看高潮| 抽查舔水白紧大视频| 啪啪啪啪啪啪啪免费视频| 非洲黑人一级特黄片| 久久三久久三久久三久久| 亚洲的电影一区二区三区| 国产不卡av在线免费| 免费一级特黄特色大片在线观看| 国产精品国色综合久久| 中文字幕无码一区二区免费| 国产清纯美女al在线| 十八禁在线观看地址免费| 动漫黑丝美女的鸡巴| 亚洲人妻国产精品综合| 国产成人自拍视频在线免费观看| 亚洲国产成人最新资源| 国产一区成人在线观看视频| okirakuhuhu在线观看| 欧美精产国品一二三产品区别大吗| 91久久人澡人人添人人爽乱| 中文字幕日韩精品日本| 日韩美女搞黄视频免费| 亚洲国产欧美一区二区三区…| 午夜精品亚洲精品五月色| 2020韩国午夜女主播在线| 少妇人妻真实精品视频| 阴茎插到阴道里面的视频| 2020中文字幕在线播放| 最新中文字幕乱码在线| 亚洲一区二区久久久人妻| 国产又色又刺激在线视频| 99一区二区在线观看| 91久久人澡人人添人人爽乱| 蜜臀成人av在线播放| 91在线免费观看成人| 中文字幕日韩无敌亚洲精品| 97人人妻人人澡人人爽人人精品| 91免费放福利在线观看| 亚洲欧美另类手机在线| 加勒比视频在线免费观看| 家庭女教师中文字幕在线播放| 2022国产综合在线干| 中字幕人妻熟女人妻a62v网 | 成年午夜免费无码区| 一个色综合男人天堂| 97黄网站在线观看| 天天躁日日躁狠狠躁躁欧美av| 婷婷综合亚洲爱久久| 日韩欧美高清免费在线| 国产精品人妻66p| 青草久久视频在线观看| 伊人开心婷婷国产av| 免费观看丰满少妇做受| 国产janese在线播放| 青青草原网站在线观看| 国产精品久久久久久久女人18| 成人综合亚洲欧美一区| 真实国产乱子伦一区二区| 久久久久久久久久久免费女人| 精品91自产拍在线观看一区| 999热精品视频在线| 国产精品福利小视频a| 宅男噜噜噜666免费观看| 欧洲亚洲欧美日韩综合| 青青青青青手机视频| 色综合久久无码中文字幕波多| 在线免费观看靠比视频的网站| 又大又湿又爽又紧A视频| 国产中文精品在线观看| 国产91精品拍在线观看| 五十路人妻熟女av一区二区| 欧美少妇性一区二区三区| 无忧传媒在线观看视频| 婷婷五月亚洲综合在线| 嫩草aⅴ一区二区三区| 影音先锋女人av噜噜色| 天天干天天操天天扣| 五十路熟女av天堂| 激情内射在线免费观看| 新97超碰在线观看| 国产精品伦理片一区二区| 久久久久久久久久一区二区三区| 岛国一区二区三区视频在线| 日韩欧美中文国产在线| 中文字日产幕乱六区蜜桃| 亚洲av午夜免费观看| 亚洲成人三级在线播放| 女警官打开双腿沦为性奴| 青青草精品在线视频观看| 亚洲国产最大av综合| 久久久久五月天丁香社区| 在线观看国产免费麻豆| 蜜桃精品久久久一区二区| 啪啪啪啪啪啪啪免费视频| 黄色大片男人操女人逼| 久久久久久久99精品| 青青青青青青青青青青草青青| 青青青青青青青在线播放视频| 亚洲另类综合一区小说| okirakuhuhu在线观看| www日韩毛片av| 成人乱码一区二区三区av| 激情综合治理六月婷婷| 亚洲图片欧美校园春色| 777奇米久久精品一区| aⅴ五十路av熟女中出| 嫩草aⅴ一区二区三区| 看一级特黄a大片日本片黑人| 亚洲av极品精品在线观看| 国产真实灌醉下药美女av福利| 黄页网视频在线免费观看| 91精品国产高清自在线看香蕉网| 一二三中文乱码亚洲乱码one| 亚洲午夜电影在线观看| av网址在线播放大全| 欧美地区一二三专区| 天天想要天天操天天干| av乱码一区二区三区| 大香蕉伊人国产在线| 欧美日韩亚洲国产无线码| 99久久超碰人妻国产| 婷婷色中文亚洲网68| 91九色porny国产蝌蚪视频| 青青草国内在线视频精选| 熟女少妇激情五十路| 久久久久久久99精品| huangse网站在线观看| 高清成人av一区三区 | 第一福利视频在线观看| 亚洲男人让女人爽的视频| 亚洲中文字幕综合小综合| 91高清成人在线视频| 一区二区视频在线观看免费观看| 91大神福利视频网| 99久久久无码国产精品性出奶水 | 日本裸体熟妇区二区欧美| 中文字幕乱码av资源| 国产在线观看黄色视频| 99国产精品窥熟女精品| 久久久久久9999久久久久| 北条麻妃高跟丝袜啪啪| 欧美一区二区中文字幕电影 | 日本xx片在线观看| 日韩影片一区二区三区不卡免费| 色婷婷精品大在线观看| 国产日本精品久久久久久久| 五月色婷婷综合开心网4438| 天天日天天爽天天爽| 亚洲一区自拍高清免费视频| 亚洲精品国产综合久久久久久久久| 4个黑人操素人视频网站精品91| 欧美精品久久久久久影院| 中文字幕高清在线免费播放| 亚洲人妻视频在线网| 黄色资源视频网站日韩| 亚洲第一伊人天堂网| 91 亚洲视频在线观看| 欧美激情精品在线观看| 99av国产精品欲麻豆| 顶级尤物粉嫩小尤物网站| 国产精品人妻66p| 国产黑丝高跟鞋视频在线播放 | 国产精品国产精品一区二区| v888av在线观看视频| 狠狠鲁狠狠操天天晚上干干| 成人影片高清在线观看| 大屁股肉感人妻中文字幕在线| 亚洲av天堂在线播放| 一级a看免费观看网站| 亚洲欧美人精品高清| 日本熟妇一区二区x x| 国产在线一区二区三区麻酥酥| 亚洲国产40页第21页| 天天日天天干天天爱| 日韩黄色片在线观看网站| 亚洲午夜伦理视频在线| 摧残蹂躏av一二三区| 一个人免费在线观看ww视频| 国产美女午夜福利久久| 91超碰青青中文字幕| 中文字幕奴隷色的舞台50| 2022国产精品视频| 国产麻豆91在线视频| 亚洲男人让女人爽的视频| 真实国模和老外性视频| 超pen在线观看视频公开97| 国产精品免费不卡av| 精品乱子伦一区二区三区免费播 | 国产一级精品综合av| av在线观看网址av| 伊人情人综合成人久久网小说 | 天天日天天透天天操| 国产夫妻视频在线观看免费 | 成人综合亚洲欧美一区| 精品一线二线三线日本| 国产麻豆剧果冻传媒app| 天天插天天色天天日| av乱码一区二区三区| 夜夜嗨av一区二区三区中文字幕| 99热这里只有国产精品6| 日本脱亚入欧是指什么| 久久久极品久久蜜桃| 黑人解禁人妻叶爱071| 中文字幕+中文字幕| 国际av大片在线免费观看| 在线免费观看黄页视频| japanese日本熟妇另类| 国产一区二区视频观看| 国产精品视频资源在线播放| 久久精品国产999| 亚洲成人激情av在线| av一区二区三区人妻| 亚洲欧美激情国产综合久久久 | 国产免费高清视频视频| 一区二区三区四区五区性感视频 | 爱爱免费在线观看视频| 亚洲美女自偷自拍11页| 国产高潮无码喷水AV片在线观看| 欧美乱妇无乱码一区二区| 欧美美女人体视频一区| 国产普通话插插视频| 青青青aaaa免费| 大学生A级毛片免费视频| 人妻少妇精品久久久久久| 日本人妻少妇18—xx| 丝袜美腿欧美另类 中文字幕| 天天插天天色天天日| 亚洲福利精品视频在线免费观看| 一区二区三区四区中文| 99精品视频在线观看婷婷| 成人福利视频免费在线| 欧美精品国产综合久久| 国产av一区2区3区| 在线播放一区二区三区Av无码| 老司机99精品视频在线观看| 99国内小视频在现欢看| 日韩国产乱码中文字幕| 国产精品亚洲а∨天堂免| 含骚鸡巴玩逼逼视频| 亚洲成人黄色一区二区三区| 黄色录像鸡巴插进去| 免费黄页网站4188| 久久久麻豆精亚洲av麻花| 欧美国产亚洲中英文字幕| 阴茎插到阴道里面的视频| 国产三级精品三级在线不卡| 视频一区二区综合精品| 国产精品久久久黄网站| 亚洲视频在线观看高清| 东京热男人的av天堂| 日本一二三区不卡无| 国产精品手机在线看片| 国产亚洲国产av网站在线| 51国产偷自视频在线播放| 一区二区三区日本伦理| 在线网站你懂得老司机| 成人精品视频99第一页| 亚洲精品乱码久久久久久密桃明| 国产chinesehd精品麻豆| 亚洲天堂精品久久久| 人妻丝袜诱惑我操她视频| 亚洲免费va在线播放| 国产V亚洲V天堂无码欠欠| 大黑人性xxxxbbbb| 日本韩国免费一区二区三区视频| 亚洲免费福利一区二区三区| 亚洲图库另类图片区| 亚洲中文字幕人妻一区| 97国产精品97久久| 国产大鸡巴大鸡巴操小骚逼小骚逼| 成人av免费不卡在线观看| 五十路在线观看完整版| 鸡巴操逼一级黄色气| 天堂中文字幕翔田av| 成人免费做爰高潮视频| 水蜜桃国产一区二区三区| 国产日韩欧美视频在线导航| 亚洲精品国产综合久久久久久久久| 青青青青在线视频免费观看| 久草视频首页在线观看| 亚洲欧美成人综合视频| 人妻激情图片视频小说| 亚洲成人午夜电影在线观看| 黄色av网站免费在线| 国产欧美日韩第三页| 9久在线视频只有精品| 香蕉91一区二区三区| 久精品人妻一区二区三区| 欧美色呦呦最新网址| 97精品视频在线观看| 日本欧美视频在线观看三区| 又粗又长 明星操逼小视频| 欧美一区二区三区啪啪同性| 亚洲熟色妇av日韩熟色妇在线| 中文字幕一区二区人妻电影冢本| 久久美欧人妻少妇一区二区三区| 亚洲欧洲一区二区在线观看| 国产 在线 免费 精品| 特大黑人巨大xxxx| 最新91精品视频在线| 亚洲在线一区二区欧美| 亚洲天天干 夜夜操| 馒头大胆亚洲一区二区| 超碰公开大香蕉97| 国产揄拍高清国内精品对白| 亚洲精品国品乱码久久久久| 日本乱人一区二区三区| 欧美日本在线视频一区| 青青青青青青青青青青草青青| 青青草亚洲国产精品视频| 啊啊好慢点插舔我逼啊啊啊视频 | 五十路av熟女松本翔子| 午夜国产福利在线观看| 国产麻豆剧传媒精品国产av蜜桃| 亚洲av黄色在线网站| 精品一区二区亚洲欧美| 日本免费一级黄色录像| 欧美偷拍亚洲一区二区| 午夜在线观看岛国av,com| 人妻另类专区欧美制服| 国产日韩一区二区在线看| 亚洲 欧美 自拍 偷拍 在线| 国产精品久久久久久久久福交| 岳太深了紧紧的中文字幕| 成人18禁网站在线播放| 把腿张开让我插进去视频| 超碰在线中文字幕一区二区| 一区二区三区久久久91| 欧美视频综合第一页| 日日爽天天干夜夜操| 天天日天天干天天搡| 欧美熟妇一区二区三区仙踪林| 国产黄色高清资源在线免费观看| 亚洲国产欧美一区二区三区久久| 亚洲成人线上免费视频观看| 一区二区三区欧美日韩高清播放| 精品高跟鞋丝袜一区二区| 人妻少妇精品久久久久久| 风流唐伯虎电视剧在线观看| 黑人巨大的吊bdsm|