2024-08-13

在JavaScript中,sessionStoragelocalStorage是两种客户端的存储方式,可以用来在用户浏览器中保存键值对数据。

  1. sessionStorage是会话存储,存储的数据只有在同一个会话中的页面才能访问,当会话结束(比如关闭页面)时,数据会被清除。
  2. localStorage是本地存储,存储的数据会永久保存,除非主动删除,否则数据不会消失。

以下是使用sessionStoragelocalStorage的示例代码:




// 存储到sessionStorage
sessionStorage.setItem('key', 'value');
 
// 从sessionStorage获取值
var value = sessionStorage.getItem('key');
console.log(value); // 输出: 'value'
 
// 存储到localStorage
localStorage.setItem('key', 'value');
 
// 从localStorage获取值
var value = localStorage.getItem('key');
console.log(value); // 输出: 'value'
 
// 从sessionStorage删除键值对
sessionStorage.removeItem('key');
 
// 从localStorage删除键值对
localStorage.removeItem('key');
 
// 清空sessionStorage
sessionStorage.clear();
 
// 清空localStorage
localStorage.clear();

请注意,存储数据时,值会被转换成字符串形式,如果需要存储对象,需要先将对象转换为JSON字符串,取出时再将字符串解析为对象。




// 存储对象到localStorage
var obj = { name: 'John', age: 30 };
localStorage.setItem('user', JSON.stringify(obj));
 
// 获取对象从localStorage
var user = JSON.parse(localStorage.getItem('user'));
console.log(user.name); // 输出: 'John'
2024-08-13

ObjectiveGumbo 是一个用于解析 HTML 的库,它是 Google 的 Gumbo 解析库的 Objective-C 包装器。Gumbo 是一个用 C 编写的 HTML 解析库,专注于解析速度和内存效率。

以下是一个简单的例子,展示如何使用 ObjectiveGumbo 来解析 HTML 文档:




#import <Foundation/Foundation.h>
#import <ObjectiveGumbo/ObjectiveGumbo.h>
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个 Gumbo 解析器
        GumboParser parser;
        gumbo_init(&parser);
 
        // 解析一个 HTML 字符串
        GumboOutput *output = gumbo_parse(&parser, "<html><head><title>Test</title></head><body><p>Hello, world!</p></body></html>");
 
        // 遍历解析树
        GumboNode *root = output->root;
        if (root->type == GUMBO_NODE_DOCUMENT) {
            GumboVector children = root->v.document.children;
            for (unsigned int i = 0; i < children.length; i++) {
                GumboNode *node = children.data[i];
                // 输出每个节点的类型和名称
                NSLog(@"Node type: %d, Tag: %s", node->type, gumbo_normalized_tagname(node->v.element.tag));
            }
        }
 
        // 清理解析器和输出
        gumbo_destroy_output(&kGumboDefaultOptions, output);
        gumbo_deinit(&parser);
    }
    return 0;
}

这段代码创建了一个 GumboParser 对象,用于解析一个简单的 HTML 字符串。然后,它遍历了解析得到的树,并输出每个节点的类型和标签名。最后,它清理了解析器和输出结构。这个例子展示了如何使用 ObjectiveGumbo 来进行基本的 HTML 解析。

2024-08-13



// main.js
import { createApp } from 'vue'
import App from './App.vue'
import { setupStore } from './store'
import { setupRouter } from './router'
import './styles/index.css'
 
// 自适应屏幕
import { clientWidth, clientHeight } from './utils/responsive'
 
const app = createApp(App)
 
// 设置状态管理
setupStore(app)
 
// 设置路由
setupRouter(app)
 
// 设置viewport
const setViewport = () => {
  const { remDesign, rem2px } = clientWidth()
  const scale = remDesign / rem2px
  const content = `width=device-width,initial-scale=${scale},minimum-scale=${scale},maximum-scale=${scale},user-scalable=no`
  document.querySelector('meta[name="viewport"]').setAttribute('content', content)
}
 
// 监听窗口大小变化
window.addEventListener('resize', setViewport)
 
// 初始化viewport
setViewport()
 
app.mount('#app')

这段代码示例展示了如何在Vite+Vue 3项目中设置viewport以实现移动端的屏幕自适应。首先,导入了必要的工具函数和配置,然后在创建Vue应用后设置了状态管理、路由和viewport。最后,监听窗口大小变化并在变化时更新viewport设置。这样做可以确保在屏幕大小发生变化时,页面的布局和样式仍然能够正确适配。

2024-08-13

这个问题可能是由于Vue Router的导航守卫或者是组件的渲染条件导致的。

解决方法:

  1. 检查路由守卫:确保你没有在全局前置守卫或者路由独享的守卫中进行了重定向或取消了导航。



// 错误示例 - 可能导致路由多次点击无响应
router.beforeEach((to, from, next) => {
  if (/* 某些条件 */) {
    next(false); // 取消导航
  } else {
    next(); // 正常导航
  }
});
  1. 检查组件渲染条件:确保你的组件只在正确的路由匹配时才进行渲染。



// 错误示例 - 可能导致路由多次点击无响应
<template>
  <div v-if="isRouteActive">
    <!-- 组件内容 -->
  </div>
</template>
 
<script>
export default {
  computed: {
    isRouteActive() {
      return this.$route.path === '/your-route-path'; // 检查路由是否激活
    }
  }
}
</script>
  1. 使用Vue开发者工具查看组件渲染情况:如果以上都没问题,可以使用Vue开发者工具查看组件是否被渲染,以及是否有任何渲染阻塞的警告或错误。
  2. 确保路由配置正确:确认你的路由配置没有问题,确保路径匹配正确,且组件正确导入。



// 正确的路由配置示例
const routes = [
  {
    path: '/your-route-path',
    component: YourComponent,
  },
  // ...其他路由
];

如果以上步骤都不能解决问题,可能需要提供更多的代码和上下文信息来进一步诊断问题。

2024-08-13

HTML5 引入了一些新的表单属性,这些属性可以提高表单的可用性和可读性,还可以帮助浏览器更好地理解表单数据的目的和格式。以下是一些常见的 HTML5 表单新属性:

  1. required - 指示输入字段不能为空。
  2. pattern - 用于验证输入字段是否符合给定的正则表达式。
  3. minmax - 为数值设置最小值和最大值。
  4. step - 设置数值输入字段的合法数字间隔。
  5. placeholder - 提供输入字段的提示信息。
  6. autofocus - 页面加载时自动聚焦到输入字段。
  7. multiple - 允许输入字段接受多个值。
  8. form - 指定输入字段属于哪个表单,即使输入字段位于表单之外。

示例代码:




<!DOCTYPE html>
<html>
<head>
    <title>HTML5 表单新属性示例</title>
</head>
<body>
    <form action="/submit">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required>
        
        <label for="email">邮箱:</label>
        <input type="email" id="email" name="email" required pattern="[^@]+@[^@]+">
        
        <label for="age">年龄:</label>
        <input type="number" id="age" name="age" min="0" max="120" step="1">
        
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" placeholder="请输入密码" autocomplete="new-password">
        
        <label for="photo">照片:</label>
        <input type="file" id="photo" name="photo" multiple>
        
        <input type="submit">
    </form>
</body>
</html>

在这个示例中,我们创建了一个带有多个 HTML5 表单属性的表单。每个输入字段都使用了一些新属性来增强用户体验和表单数据的验证。

2024-08-13

在HTML中,可以使用tabindex属性来控制元素的焦点顺序。tabindex属性可以设置为一个正整数或者是特殊值"0",来指示元素在按下Tab键时应该获得焦点的顺序。如果设置为"-1",则表示该元素不可通过Tab键获得焦点。

以下是一个简单的例子,展示了如何使用tabindex来控制元素的焦点顺序:




<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tabindex Example</title>
</head>
<body>
 
<p>Normal Element 1</p>
<p tabindex="0">Element with tabindex 0</p>
<p>Normal Element 2</p>
<p tabindex="1">Element with tabindex 1</p>
<p>Normal Element 3</p>
<p tabindex="2">Element with tabindex 2</p>
<p>Normal Element 4</p>
<p tabindex="-1">Element with tabindex -1</p>
<p>Normal Element 5</p>
 
</body>
</html>

在这个例子中,当用户使用Tab键在页面上进行导航时,他们会首先看到"Element with tabindex 0",然后是"Element with tabindex 1",依此类推。"Element with tabindex -1"将不会被Tab键聚焦,因为它的tabindex被设置为"-1"。

2024-08-13

在HTML5中,我们可以使用<audio><video>标签来嵌入音频和视频内容。以下是一些使用这些标签的示例代码:

  1. 基本的音频播放:



<audio controls>
  <source src="horse.ogg" type="audio/ogg">
  <source src="horse.mp3" type="audio/mpeg">
  您的浏览器不支持 audio 元素。
</audio>
  1. 带有回退的视频播放:



<video width="320" height="240" controls>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
  您的浏览器不支持 video 元素。
</video>
  1. 自动播放视频,循环播放:



<video width="320" height="240" autoplay loop controls>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
  您的浏览器不支持 video 元素。
</video>
  1. 使用JavaScript控制视频播放:



<button onclick="playPause()">播放/暂停</button>
<video id="myVideo" width="320" height="240" controls>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
  您的浏览器不支持 video 元素。
</video>
 
<script>
var myVideo = document.getElementById("myVideo");
 
function playPause() {
  if (myVideo.paused)
    myVideo.play();
  else
    myVideo.pause();
}
</script>

这些示例展示了如何在HTML5中嵌入音频和视频,并提供了基本的控制功能。开发者可以根据自己的需求,使用这些标签并添加额外的属性和JavaScript代码来增强多媒体体验。

2024-08-13

在JavaScript中,原生获取DOM节点可以通过以下方法:

  1. 通过ID获取元素:



var element = document.getElementById('elementId');
  1. 通过类名获取元素集合:



var elements = document.getElementsByClassName('className');
  1. 通过标签名获取元素集合:



var elements = document.getElementsByTagName('tagName');
  1. 通过CSS选择器获取单个元素:



var element = document.querySelector('.className');
  1. 通过CSS选择器获取元素集合:



var elements = document.querySelectorAll('.className');

每个方法都有其适用的场景,getElementById 适用于只需获取页面中唯一ID的元素,getElementsByClassNamegetElementsByTagName 返回的是HTMLCollection,而querySelectorquerySelectorAll 返回的是NodeList。

2024-08-13

在Vue中使用audio标签时,你可以像使用普通HTML标签一样将其放入模板中。但是,如果你需要处理播放、暂停、加载状态等,你可能需要使用Vue的响应式数据绑定和事件监听来实现这些功能。

以下是一个简单的例子,展示了如何在Vue组件中使用audio标签:




<template>
  <div>
    <audio ref="audioPlayer" :src="audioSrc" @canplay="audioReady = true" @ended="nextSong"></audio>
    <button @click="play" :disabled="!audioReady">播放</button>
    <button @click="pause" :disabled="!audioReady">暂停</button>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      audioSrc: 'path_to_your_audio_file.mp3',
      audioReady: false
    };
  },
  methods: {
    play() {
      this.$refs.audioPlayer.play();
    },
    pause() {
      this.$refs.audioPlayer.pause();
    },
    nextSong() {
      // 切换到下一首歌
    }
  }
};
</script>

在这个例子中,我们使用了Vue的ref属性来引用audio元素,并通过src属性绑定了音频文件的路径。@canplay事件在音频文件可以播放时触发,并将audioReady标志设置为true,这样播放按钮就不会禁用。@ended事件监听音频播放结束的事件,并可以在此事件中实现切换到下一首歌的逻辑。

请注意,根据你的具体需求,你可能需要添加额外的逻辑,例如音量控制、进度条更新、错误处理等。

2024-08-13

以下是一个使用HTML5和CSS3创建的爱心树表白页面的简单示例:




<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>爱心树表白</title>
<style>
  body, html {
    height: 100%;
    margin: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    background: #222 url(background.jpg) no-repeat center center fixed;
    background-size: cover;
  }
 
  .heart-container {
    position: relative;
    width: 200px;
    height: 200px;
    perspective: 600px;
  }
 
  .heart {
    position: absolute;
    width: 100%;
    height: 100%;
    background: #f00;
    transform-origin: center bottom;
    animation: rotate 5s infinite linear;
  }
 
  .heart:before, .heart:after {
    content: '';
    position: absolute;
    width: 100%;
    height: 100%;
    background: #f00;
    border-radius: 50%;
  }
 
  .heart:before {
    top: -50%;
    left: 0;
    transform: translate(0, -50%);
  }
 
  .heart:after {
    top: 0;
    left: -50%;
    transform: translate(-50%, 0);
  }
 
  @keyframes rotate {
    0% {
      transform: rotateX(90deg) rotateY(0deg) rotateZ(0deg);
    }
    100% {
      transform: rotateX(90deg) rotateY(360deg) rotateZ(360deg);
    }
  }
 
  .text {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: white;
    font-size: 20px;
    text-align: center;
  }
</style>
</head>
<body>
 
<div class="heart-container">
  <div class="heart"></div>
</div>
<div class="text">
  <p>我爱你,爱心树将永远开放给你。</p>
</div>
 
</body>
</html>

在这个示例中,我们创建了一个包含爱心图案的容器,通过CSS3的动画效果实现爱心的旋转。背景使用了一张树木的图片,进一步增加了表白的真实感。这个页面简洁而有趣,可以作为表白的一种方式。