当前位置: 首页 > news >正文

北京网站设计开发公司接单平台

北京网站设计开发公司,接单平台,产品包装设计100例,三维建筑设计软件title: WebAPI语法 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端WEB API 了解DOM的结构并掌握其基本的操作,体验 DOM 在开发中的作用 API简介 就是使用js来操作html和浏览器 什么是DOM? 就是一个文档对象模型,是用来呈现预计于任意htm…
title: WebAPI语法
date: 2025-01-28 12:00:00
tags:- 前端
categories:- 前端

WEB API

了解DOM的结构并掌握其基本的操作,体验 DOM 在开发中的作用

API简介

就是使用js来操作html和浏览器

image-20250118230748212

什么是DOM?

就是一个文档对象模型,是用来呈现预计于任意html交互的API.

一句话:是浏览器提供的一套专门来操作网页内容的功能。

  • DOM :开发网页内容特效和实现用户交互。

  • image-20250118230824335

DOM树

将html文档以树状结构直观的呈现出来,我们称之为文档树,DOm树

描述网页内容关系的名词。

作用:文档树直观的体现了标签与标签的关系

image-20250118230838046

DOM对象(重要)

  • 对象:浏览器根据html标签生成的Js对象

  • 所有的标签属性都可以在这个对象上面找到

  • 修改这个对象的属性会自动映射到标签身上。

核心思想:把网页内容当作对象来处理。

Document :是DOM里面提供的一个对象

  • 所以他提供的属性和方法都是用来访问和操作网页内容的

  • 网页内容都在document里面

    获取一个DOM 元素我们使用谁?能直接操作修改吗?

    一般我们用的谁querySelector() 可以直接操作修改

    获取多个DOM 元素我们使用querySelctorAll(),不可以直接进行修改,只能通过遍历的方式一次给里面的元素做修改。

根据CSS选择器来获取DOM元素(重点)

document.querySelctorAll('css选择器')

得到的是一个伪数组

  • 有长度有索引号的数组

  • 但是没有pop(),push()等数组的方法

    想要得到里面的每一个对象,则需要遍历(for)来实现。

那么我应该怎么做呢?

//获取元素
const lis = document,querySelectorAll('.nav li')
//console.log(lis)
for(let i = 0;i<lis.length;i++)
{console.log(lis[i]); //每一个小li对象
}

小括号里面的参数必须是字符串,也就是必须加引号。

其他获取DOM元素的方法

document.getElementById('nav')
//根据id获取一个元素

操作元素内容

目标:能够修改元素的文本更换内容

DOM对象就是根据标签生成的,所以操作标签,本质上就是操作DOM对象

就是操作对象使用的点语法

如果想要修改标签元素的里面的内容,那么可以使用如下的几种方式

  • 对象.innerText属性

    那么具体上是怎么要的呢

    <div class="box">我是文字的内容</div>
    <script>
    //获取元素
    const box = document.querySelector('.box')
    //修改文字内容。对象.innerText 属性
    console.log(box.innerText)  //获取文字内容
    box.innerText = '我是一个盒子'
    </script>

    innerText 属性 显示纯文本,不解析标签

    可以将文本内容添加/更新到任意标签位置

  • 对象.innerHTML属性

<div class="box">我是文字的内容</div>
<script>
//获取元素
const box = document.querySelector('.box')
//修改文字内容。对象.innerText 属性
console.log(box.innerText)  //获取文字内容
box.innerHTML = '<strong>我要更换</strong>'
</script>

一个具体例子

<script>
//线声明一下数组
const personArr = ['周杰伦','sw','qd','wdw']
//随机数数组下标
const random = Math.floor(Math.random() * personArr.length)
//获取one 元素
const one = doucument.querySelctor('#one')
</script>

image-20250124231229553

操作元素属性

对象.属性 = 值

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><img src="./images/1.webp" alt=""><script>// 1. 获取图片元素const img = document.querySelector('img');// 2. 修改图片对象的属性img.src = './images/2.webp';img.title = 'pink老师的艺术照';</script>
</body>
</html>

然后再写一个生成随机照片的程序

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>随机图片</title>
</head>
<body><img src="./images/1.webp" alt=""><script>// 获取 N ~ M 的随机整数function getRandom(N, M) {return Math.floor(Math.random() * (M - N + 1)) + N;}
​// 1. 获取图片对象const img = document.querySelector('img');
​// 2. 随机得到序号const random = getRandom(1, 6);
​// 3. 更换路径img.src = `./images/${random}.webp`;</script>
</body>
</html>

这个得记住,当模版来记忆

操作对象的样式属性

img.src = ./images/${random}.webp; 这里是重点,也是精髓所在

小驼峰命名法(Camel Case)是一种命名约定,通常用于编程中变量、函数、对象等的命名。

特点:

1. 首字母小写:小驼峰命名法的第一个单词以小写字母开头。

2. 后续单词首字母大写:从第二个单词开始,每个单词的首字母大写,其余字母小写。

3.  **不使用分隔符**:单词之间不使用下划线、连字符等,仅通过字母大小写区分单词边界。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>修改样式</title>
</head>
<body><div class="box"></div><script>// 1. 获取元素const box = document.querySelector('.box');
​// 2. 修改样式属性 对象.style.样式属性 = '值' 别忘了跟单位box.style.width = '300px';box.style.backgroundColor = 'hotpink';box.style.border = '2px solid blue';box.style.borderTop = '2px solid red';</script>
</body>
</html>

注意这个格式

小驼峰形式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>通过类名修改样式</title><style>.box {width: 300px;height: 200px;background-color: hotpink;border: 1px solid #000;}</style>
</head>
<body><div></div><script>// 1. 获取元素const div = document.querySelector('div');// 2. 添加类名 class 是个关键字 我们用 classNamediv.className = 'box';</script>
</body>
</html>

如果你想更换的是nav 的话,可以在添加类名也就是第2步鞋

Div.className = 'nav box'

操作元素样式属性

  • 通过classList 操作类控制CSS

  • 为了解决className 容易覆盖以前的类名,我们可以通过classList 方式追加和删除类名

通过classList修改样式

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>classList.add 示例</title><style>.box {width: 100px;height: 100px;background-color: lightgray;}.active {background-color: lightblue;border: 2px solid blue;}</style>
</head>
<body><div class="box">文字</div><script>//获取元素const box = document.querySelector('.box')// 添加类名 activebox.classList.add('active')//删除一个类box.claaList.remove('active')//切换一个类box.classList.togglē('active')</script>
</body>
</html>

image-20250125141938325

轮播图

首先随机数

随机数(记住)

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>随机内容更新</title><style>.slider-wrapper img {width: 300px;height: 200px;}.slider-footer {padding: 10px;text-align: center;}</style>
</head>
<body><div class="slider-wrapper"><img src="placeholder.jpg" alt="随机图片" /></div><div class="slider-footer"><p>占位文字</p></div>
​<script>const sliderData = [{ url: 'image1.jpg', title: '图片一标题', color: '#ffcccc' },{ url: 'image2.jpg', title: '图片二标题', color: '#ccffcc' },{ url: 'image3.jpg', title: '图片三标题', color: '#ccccff' }]
​const random = parseInt(Math.random() * sliderData.length)
​const img = document.querySelector('.slider-wrapper img')img.src = sliderData[random].url
​const p = document.querySelector('.slider-footer p')p.innerHTML = sliderData[random].title
​const footer = document.querySelector('.slider-footer')footer.style.backgroundColor = sliderData[random].color</script>
</body>
</html>

加小点

的具体实现

<div class="slider-wrapper"><img src="placeholder.jpg" alt="图片"><ul class="slider-indicator"><li></li><li></li><li></li></ul>
</div>
.slider-wrapper {position: relative;width: 300px;height: 200px;
}
​
.slider-wrapper img {width: 100%;height: 100%;
}
​
.slider-indicator {position: absolute;bottom: 10px;left: 50%;transform: translateX(-50%);display: flex;justify-content: center;list-style: none;padding: 0;
}
​
.slider-indicator li {width: 10px;height: 10px;background-color: lightgray;border-radius: 50%;margin: 0 5px;cursor: pointer;
}
​
.slider-indicator li.active {background-color: blue; /* 当前选中小圆点的颜色 */
}
const sliderData = [{ url: 'image1.jpg', title: '图片一标题', color: '#ffcccc' },{ url: 'image2.jpg', title: '图片二标题', color: '#ccffcc' },{ url: 'image3.jpg', title: '图片三标题', color: '#ccccff' }
];
​
// 随机选择一个图片和对应的小圆点
const random = parseInt(Math.random() * sliderData.length);
​
// 更新图片
const img = document.querySelector('.slider-wrapper img');
img.src = sliderData[random].url;
​
// 更新标题
const p = document.querySelector('.slider-footer p');
p.innerHTML = sliderData[random].title;
​
// 更新背景颜色
const footer = document.querySelector('.slider-footer');
footer.style.backgroundColor = sliderData[random].color;
​
// 选中小圆点并添加 active 类
const li = document.querySelector(`.slider-indicator li:nth-child(${random + 1})`);
li.classList.add('active');

image-20250125145247336

操作表单元素属性

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>表单值操作</title>
</head>
<body><input type="text" value="电脑" id="uname">
​<script>// 1. 获取元素const uname = document.querySelector('input');
​// 2. 获取值// 获取表单里当前的值,用 uname.valueconsole.log(uname.value); // 输出:电脑
​// innerHTML 无法获取表单值console.log(uname.innerHTML); // 输出:undefined 或空字符串
​// 3. 设置表单的值uname.value = '我要买电脑';console.log(uname.value); // 输出:我要买电脑
​// 4. 获取和设置表单类型console.log(uname.type); // 输出:textuname.type = 'password'; // 将表单类型改为密码输入框</script>
</body>
</html>

操作表属性(实现勾选)

自定义属性

image-20250125150806639

这样就会出现5个<div>

自定义属性。在html5中推出来了专门的data-自定义属性

在标签上一律是以data-开头

在DOM对象上一律是以dataset对象方式获取

<div data-id="1" data-spm="不知道">1</div>
<div data-id="2">2</div>
<div data-id="3">3</div>
<div data-id="4">4</div>
<div data-id="5">5</div>
const one = document.querySelector('div');
console.log(one.dataset.id);  // 输出:1
console.log(one.dataset.spm); // 输出:不知道

image-20250125151431441

定时器

image-20250125151531531

间歇函数

<body><script>第一种方法setInterval(fuction(){console.log('1111')},1000)第二种方法setInterval(fn,3000)关闭定时器fuction fn(){console.log('1111')}let n = setInterval(fn,1000)console.log(n)clearInterval(n)</script>
</body>

image-20250125153036936

实现用户倒计时效果

let i = 1
setInterval(fuction (){
i++
document.write(i)
},200)

image-20250125154225375

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>倒计时启用按钮</title><style>.btn {padding: 10px 20px;font-size: 16px;cursor: not-allowed;}.btn:enabled {cursor: pointer;}</style>
</head>
<body><button class="btn" disabled>我已经阅读用户协议(5)</button>
​<script>// 1. 获取元素const btn = document.querySelector('.btn');// console.log(btn.innerHTML); // 按钮的初始内容
​// 2. 倒计时let i = 5; // 倒计时初始值// 2.1 开启定时器let n = setInterval(function () {i--; // 倒计时减少// 更新按钮文字btn.innerHTML = `我已经阅读用户协议(${i})`;// 判断倒计时是否结束if (i === 0) {clearInterval(n); // 关闭定时器// 定时器停止后,按钮可用,文字更新为“同意”btn.disabled = false;btn.innerHTML = '同意';}}, 1000); // 每秒执行一次</script>
</body>
</html>

轮播图定时器版本

论比

事件监听

程序检测是否有事件发生。

image-20250126094443829

关闭广告

image-20250126095013506

日期对象

const date = new

const date =  new Date()
console.log(data)
console.log(date.getFullYear());
const date1 = new Date('')
console.log(date1)
​

image-20250126100117535

image-20250126100343310

时间戳

在 JavaScript 中,时间戳(Timestamp) 是指从 1970 年 1 月 1 日 00:00:00 UTC 开始的毫秒数,用于表示一个具体的时间点。以下是关于时间戳的相关知识和常用方法。

image-20250126100629885

这是获得时间的三种方式

image-20250126100815491

查找DOM节点

在前端开发中,DOM(Document Object Model)节点是 HTML 文档的基础组成部分。DOM 是一种用于表示和操作 HTML 和 XML 文档的编程接口。

什么是 DOM 节点?

节点(Node) 是 DOM 树中的基本单元。

• 每个节点代表 HTML 文档中的一部分,比如标签、属性、文本等。

• 整个 HTML 文档被解析后,会被表示为一个由节点组成的树状结构,称为 DOM 树元素节点 表示 HTML 标签,比如

image-20250126100952344

查找节点

通过 ID 查找

const node = document.getElementById("myID");

通过类名查找:

const nodes = document.getElementsByClassName("myClass");

通过标签名查找:

const nodes = document.getElementsByTagName("div");

使用 querySelector

const node = document.querySelector(".myClass"); // 选择第一个符合条件的节点
const nodes = document.querySelectorAll(".myClass"); // 选择所有符合条件的节点

父子节点

image-20250126101849007

增加节点

创造节点

const newDiv = document.createElement("div");

添加子节点:

const parent = document.getElementById("parent");
const child = document.createElement("div");
parent.appendChild(child);

在指定位置插入节点

const parent = document.getElementById("parent");
const newNode = document.createElement("p");
const referenceNode = document.getElementById("child");
parent.insertBefore(newNode, referenceNode);

删除节点:

const parent = document.getElementById("parent");
const child = document.getElementById("child");
parent.removeChild(child);

修改节点内容

const node = document.getElementById("myID");
node.textContent = "New Content";

修改节点属性

const node = document.getElementById("myID");
node.setAttribute("class", "newClass");

DOM 节点关系

在 DOM 树中,节点之间存在层级关系:

父节点(Parent Node): 使用 parentNode 属性访问。

const parent = childNode.parentNode;

子节点(Child Nodes): 使用 childNodes 属性访问(包括文本节点)。

const children = parentNode.childNodes;

第一个子节点/最后一个子节点:

const firstChild = parentNode.firstChild;
const lastChild = parentNode.lastChild;

兄弟节点(Sibling Nodes):

const nextSibling = currentNode.nextSibling; // 下一个节点
const previousSibling = currentNode.previousSibling; // 上一个节点

M端事件

image-20250126102719326

swipper插件

在swipper插件这里

BOM

image-20250126115026862

在前端开发中,BOMBrowser Object Model,浏览器对象模型)是一个用于操作浏览器窗口和浏览器相关功能的接口。BOM 提供了 JavaScript 与浏览器交互的能力,比如控制窗口、导航、获取浏览器信息等。

在前端开发中,BOMBrowser Object Model,浏览器对象模型)是一个用于操作浏览器窗口和浏览器相关功能的接口。BOM 提供了 JavaScript 与浏览器交互的能力,比如控制窗口、导航、获取浏览器信息等。

console.log(window.innerWidth);  // 浏览器窗口的宽度
console.log(window.innerHeight); // 浏览器窗口的高度
window.alert("这是一个弹窗!");  // 显示警告框
window.open("https://www.example.com"); // 打开新窗口

2. navigator 对象

• 提供浏览器和用户设备的信息,比如浏览器的名称、版本、操作系统等。

console.log(navigator.userAgent);      // 用户代理字符串,包含浏览器信息
console.log(navigator.platform);      // 操作系统类型
console.log(navigator.language);      // 当前使用的语言
console.log(navigator.onLine);        // 检测是否联网

3. location 对象

• 提供当前页面的 URL 信息,并可以通过它操作浏览器跳转。

console.log(location.href);           // 当前页面的完整 URL
console.log(location.hostname);       // 主机名
console.log(location.pathname);       // 路径部分
console.log(location.search);         // 查询字符串部分
location.assign("https://www.example.com"); // 跳转到指定 URL
location.reload();                    // 重新加载当前页面

4. history 对象

• 提供对浏览器历史记录的操作能力。

history.back();  // 返回上一页
history.forward(); // 前进到下一页
history.go(-2);   // 跳转到历史记录中的指定位置,负数表示后退

image-20250126121511133

5. screen 对象

• 提供与用户屏幕相关的信息,比如分辨率。

console.log(screen.width);    // 屏幕宽度
console.log(screen.height);   // 屏幕高度
console.log(screen.availWidth);  // 可用宽度(减去任务栏等)
console.log(screen.availHeight); // 可用高度

定时器

image-20250126115922452

JS执行机制

image-20250126120538319

本地存储

在前端开发中,本地存储(Local Storage) 是 HTML5 提供的一种持久化存储方式,用于在浏览器中以键值对的形式保存数据。这些数据保存在用户的浏览器中,即使刷新页面或关闭浏览器后数据仍然存在。

1. 本地存储的特点

容量大:一般为 5MB,比传统的 cookie 容量大。

持久性:数据会一直保存在浏览器中,直到手动清除。

键值对存储:以字符串形式存储键值对。

仅在同一域名下共享:同一域名下的页面可以访问相同的本地存储。

(1) 保存数据

使用 localStorage.setItem(key, value) 方法。

localStorage.setItem('username', 'Alice');

参数说明

• key:键名(字符串)。

• value:键值(必须是字符串)。

(2) 读取数据

使用 localStorage.getItem(key) 方法。

const username = localStorage.getItem('username');
console.log(username); // 输出:Alice

(3) 删除某个键值对

使用 localStorage.removeItem(key) 方法。

localStorage.removeItem('username');

(4) 清除所有数据

使用 localStorage.clear() 方法。

localStorage.clear();

(5) 获取所有键

使用 localStorage.key(index) 方法获取指定索引的键名。

for (let i = 0; i < localStorage.length; i++) {console.log(localStorage.key(i)); // 遍历所有键名
}

image-20250126121927544

只能存储字符串

存储复杂数据类型

1. 存储对象

存储方法

将对象通过 JSON.stringify() 转换为字符串后存储:

const user = { name: 'Alice', age: 25, hobbies: ['reading', 'coding'] };
localStorage.setItem('user', JSON.stringify(user)); // 转为字符串存储

读取方法

从本地存储中获取字符串后,用 JSON.parse() 转换回对象:

const userStr = localStorage.getItem('user'); // 获取字符串
if (userStr) {const user = JSON.parse(userStr); // 转为对象console.log(user.name); // 输出:Aliceconsole.log(user.hobbies); // 输出:['reading', 'coding']
}

image-20250126150402187

Map

image-20250126150531766

map也称之为映射

join 把数组转换为字符串

image-20250126150752208

正则表达式

正则表达式(Regular Expression)是用来匹配字符串中字符模式的工具,广泛应用于文本处理,比如验证输入格式、查找替换字符串、数据提取等。

1. 正则表达式的基础

正则表达式由普通字符元字符(特殊字符)组成,具有灵活且强大的匹配能力。

image-20250126151010922

正则表达式中的一些特殊字符需要通过反斜杠 \ 转义才能匹配本身:

• . 匹配 .,* 匹配 *。

• 如果要匹配反斜杠本身,写成 \。

常见正则表达式作用

  • 表单验证

  • 过滤敏感词

  • 字符串中提取我们想要的部分

    三组词语

    匹配,替换,提取

const regex = /abc/;
const regex = /hello/i;
console.log(regex.test("Hello")); // true

定义-检测是否匹配

image-20250126151652456

image-20250126151808120

元字符(Metacharacters) 是正则表达式中具有特殊含义的字符,用于定义匹配规则,而不是直接匹配它们的字面值。元字符赋予了正则表达式强大的功能,使其可以灵活处理字符串模式匹配。

const regex = /a.b/;
console.log(regex.test("acb")); // true
console.log(regex.test("a_b")); // true
console.log(regex.test("ab"));  // false
const regex1 = /^hello/; // 必须以 "hello" 开头
console.log(regex1.test("hello world")); // true
console.log(regex1.test("world hello")); // false
​
const regex2 = /world$/; // 必须以 "world" 结尾
console.log(regex2.test("hello world")); // true
console.log(regex2.test("world hello")); // false

边界符

const regex1 = /^hello/; // 必须以 "hello" 开头
console.log(regex1.test("hello world")); // true
console.log(regex1.test("world hello")); // false
​
const regex2 = /world$/; // 必须以 "world" 结尾
console.log(regex2.test("hello world")); // true
console.log(regex2.test("world hello")); // false

(4) {}(量词)

• {n}:匹配前面的字符恰好 n 次

• {n,}:匹配前面的字符至少 n 次

• {n,m}:匹配前面的字符 n 到 m 次

const regex1 = /a{2}/; // 匹配两个连续的 "a"
console.log(regex1.test("aa")); // true
console.log(regex1.test("a"));  // false
​
const regex2 = /a{2,}/; // 匹配至少两个连续的 "a"
console.log(regex2.test("aaa")); // true
console.log(regex2.test("a"));   // false
​
const regex3 = /a{2,4}/; // 匹配 2 到 4 个连续的 "a"
console.log(regex3.test("aaa"));  // true
console.log(regex3.test("aaaaa"));// true(只匹配前 4 个 "a")

image-20250126152358336

const regex1 = /a{2}/; // 匹配两个连续的 "a"
console.log(regex1.test("aa")); // true
console.log(regex1.test("a"));  // false
​
const regex2 = /a{2,}/; // 匹配至少两个连续的 "a"
console.log(regex2.test("aaa")); // true
console.log(regex2.test("a"));   // false
​
const regex3 = /a{2,4}/; // 匹配 2 到 4 个连续的 "a"
console.log(regex3.test("aaa"));  // true
console.log(regex3.test("aaaaa"));// true(只匹配前 4 个 "a")

3. 特殊的字符类

正则表达式还提供了一些预定义的字符类,可以快速匹配特定类型的字符:

image-20250126152606091

image-20250126152750226

image-20250126152948549

image-20250126152959015


文章转载自:
http://ferrophosphorous.jjpk.cn
http://bromine.jjpk.cn
http://palpitation.jjpk.cn
http://imprisonment.jjpk.cn
http://cacti.jjpk.cn
http://discriminate.jjpk.cn
http://astute.jjpk.cn
http://interpenetration.jjpk.cn
http://reliever.jjpk.cn
http://tocometer.jjpk.cn
http://atonic.jjpk.cn
http://entrammel.jjpk.cn
http://oversimple.jjpk.cn
http://pious.jjpk.cn
http://questioning.jjpk.cn
http://harshen.jjpk.cn
http://predicament.jjpk.cn
http://mortify.jjpk.cn
http://nonchalant.jjpk.cn
http://godparent.jjpk.cn
http://landsmal.jjpk.cn
http://quinnat.jjpk.cn
http://phantasize.jjpk.cn
http://histogenetically.jjpk.cn
http://tinglass.jjpk.cn
http://attentively.jjpk.cn
http://iichester.jjpk.cn
http://cyathiform.jjpk.cn
http://fop.jjpk.cn
http://harebrained.jjpk.cn
http://autoimmunization.jjpk.cn
http://martialize.jjpk.cn
http://expandedness.jjpk.cn
http://mckenney.jjpk.cn
http://sunshiny.jjpk.cn
http://merchant.jjpk.cn
http://hal.jjpk.cn
http://provoke.jjpk.cn
http://antiseptic.jjpk.cn
http://telekineticist.jjpk.cn
http://wilful.jjpk.cn
http://barbarism.jjpk.cn
http://opencut.jjpk.cn
http://featherlet.jjpk.cn
http://knurled.jjpk.cn
http://golan.jjpk.cn
http://stationary.jjpk.cn
http://nth.jjpk.cn
http://slabby.jjpk.cn
http://impenitence.jjpk.cn
http://sura.jjpk.cn
http://hardenable.jjpk.cn
http://benchmark.jjpk.cn
http://inhibiting.jjpk.cn
http://alfur.jjpk.cn
http://lionize.jjpk.cn
http://prestore.jjpk.cn
http://droob.jjpk.cn
http://habenula.jjpk.cn
http://snubber.jjpk.cn
http://comix.jjpk.cn
http://synoil.jjpk.cn
http://gooseberry.jjpk.cn
http://photosensitizer.jjpk.cn
http://omasum.jjpk.cn
http://timbales.jjpk.cn
http://bpd.jjpk.cn
http://geogeny.jjpk.cn
http://aloysius.jjpk.cn
http://yaunde.jjpk.cn
http://bolection.jjpk.cn
http://unimpeachable.jjpk.cn
http://lanthanon.jjpk.cn
http://fish.jjpk.cn
http://supernal.jjpk.cn
http://peascod.jjpk.cn
http://internalize.jjpk.cn
http://woolding.jjpk.cn
http://concertina.jjpk.cn
http://satb.jjpk.cn
http://thurible.jjpk.cn
http://neroli.jjpk.cn
http://nudie.jjpk.cn
http://poppy.jjpk.cn
http://shortall.jjpk.cn
http://orangeade.jjpk.cn
http://isochar.jjpk.cn
http://pellagrin.jjpk.cn
http://partaker.jjpk.cn
http://freeman.jjpk.cn
http://corpus.jjpk.cn
http://her.jjpk.cn
http://alarming.jjpk.cn
http://exfoliate.jjpk.cn
http://recommendatory.jjpk.cn
http://reverence.jjpk.cn
http://chicana.jjpk.cn
http://cloddish.jjpk.cn
http://locum.jjpk.cn
http://gressorial.jjpk.cn
http://www.dt0577.cn/news/57844.html

相关文章:

  • 手机图文制作软件广州seo推荐
  • 谷歌 网站做推广成免费crm特色
  • wordpress seo by yoast 设置阳山网站seo
  • wordpress 超简洁主题厦门关键词优化报价
  • 如何让网站 被百度k自媒体135网站
  • 阅读网站建设重庆seo是什么
  • 那几个网站可以做h5上海网站推广广告
  • 济南建网站公司价格超级外链吧
  • 备案成功后怎么做网站电商关键词一般用哪些工具
  • 网站设计公司 南京seo网站关键词排名软件
  • 速贝网站友情链接怎么做百度指数如何提升
  • 毕设做网站怎么弄代码设计私人做网站建设
  • 号码百事通给做网站吗企业网站推广的形式有哪些
  • 网站建设优势石家庄seo网络推广
  • 公司找人做的网站到现在还没出来谷歌广告投放步骤
  • 外国做营销方案的网站经典软文案例标题加内容
  • 上海专业做网站价格友情链接你会回来感谢我
  • 免费动态网站下载专区新闻稿营销
  • 深圳宝安企业网站建设竞价托管哪家效果好
  • 做苗木选择哪个网站免费建站网站一站式
  • 广州越秀区疫情最新消息seo日常工作
  • 石狮建设网站推广新产品最好的方法
  • 手机门户网站开发今日头条十大新闻最新
  • 佛山做app网站seo诊断分析报告
  • 如何更快的让百度收录网站重庆网站搜索排名
  • 做兼职的国外网站郑州网站建设十大公司
  • 全国 网站备案 数量网站快速排名推广软件
  • 做商业广告有什么网站好推销的有什么软件可以推广
  • 360网站收录提交入口大全四川企业seo推广
  • 网站开发的课程网站关键词排名批量查询