以下代码报错Uncaught TypeError: hljs.highlightAll is not a function <!DOCTYPE html> <html> <head> <title>Code Display Demo</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/default.min.css"> <style> pre { background-color: #f4f4f4; padding: 10px; } code { font-family: "Courier New", Courier, monospace; } </style> </head> <body> <pre><code class="javascript"> function helloWorld() { console.log("Hello, World!"); } </code></pre> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js"></script> <script> document.addEventListener('DOMContentLoaded', function () { hljs.highlightAll(); }); </script> </body> </html>
时间: 2024-04-14 21:02:59 浏览: 205
根据你提供的代码,我注意到你使用的是 `highlight.js` 版本为 10.5.0 的库,并且在 `DOMContentLoaded` 事件中调用了 `hljs.highlightAll()` 方法。这个方法应该是存在于该版本的 `highlight.js` 中的。
报错 "Uncaught TypeError: hljs.highlightAll is not a function" 可能是由于以下几个原因导致的:
1. 引入 `highlight.js` 库的 URL 不可访问:请确保你引入的 `highlight.js` 库的 URL 是可访问的,并且没有被防火墙或其他网络限制阻止。你可以尝试在浏览器中直接打开 `https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js` 来检查是否能够访问。
2. 引入的 `highlight.js` 库与版本不匹配:请确保你引入的 `highlight.js` 库的版本与你使用的代码兼容。如果你确定引入的是正确的版本,可能是由于其他代码冲突导致 `highlightAll` 方法无法正常调用。
3. 其他代码错误:请检查你的代码中是否存在其他可能导致报错的问题,例如重复引入 `highlight.js` 库、错误的语法等。
请逐一排查以上可能原因,并进行修正。如果问题仍然存在,请提供更多相关代码和错误信息,以便我能够更好地帮助你解决问题。
相关问题
上面代码报错Uncaught TypeError: activity.addEventListener is not a function
<think>我们遇到了一个错误:`Uncaught TypeError: activity.addEventListener is not a function`。这是因为在HBuilder的H5+环境中,`plus.android.runtimeMainActivity()`返回的是一个原生的Android Activity对象,而不是一个JavaScript对象。因此,我们不能直接使用`addEventListener`方法。
在H5+中,我们应该使用`plus.globalEvent.addEventListener`来监听`newintent`事件,而不是在Activity对象上直接添加事件监听器。
### 修正方案
修改`init`函数中事件监听的代码:
1. 移除在activity对象上添加事件监听器的代码。
2. 使用`plus.globalEvent.addEventListener`来监听`newintent`事件。
### 修改后的代码
以下是修改后的`init`函数和相关部分:
```javascript
// 初始化函数
function init() {
// 获取NFC适配器
var activity = plus.android.runtimeMainActivity();
var NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
if (!nfcAdapter) {
console.error("设备不支持NFC");
return;
}
// 使用全局事件监听newintent
plus.globalEvent.addEventListener('newintent', function(e) {
if (!isScanning) return;
// 获取intent
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent(e.intent);
var action = intent.getAction();
// 过滤掉非NFC的intent
if (action === Intent.ACTION_MAIN || action === Intent.ACTION_VIEW) {
return;
}
__read(intent);
});
}
```
### 完整代码修正
以下是完整的修正后的代码:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
<title>NFC扫描控制</title>
<style>
#scanContainer {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.7);
z-index: 1000;
text-align: center;
color: white;
}
#cancelBtn {
margin-top: 20px;
padding: 15px 30px;
font-size: 18px;
background: #e74c3c;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
</style>
<script>
// 全局状态
var isScanning = false;
var waiting = null;
var nfcAdapter = null;
// 初始化函数
function init() {
// 获取NFC适配器
var activity = plus.android.runtimeMainActivity();
var NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
if (!nfcAdapter) {
console.error("设备不支持NFC");
plus.nativeUI.alert("设备不支持NFC");
return;
}
// 使用全局事件监听newintent
plus.globalEvent.addEventListener('newintent', function(e) {
if (!isScanning) return;
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent(e.intent); // 注意:这里通过e.intent创建Intent对象
var action = intent.getAction();
// 过滤掉非NFC的intent
if (action === Intent.ACTION_MAIN) {
return;
}
// 检查是否为NFC事件
if (action === "android.nfc.action.TAG_DISCOVERED" ||
action === "android.nfc.action.NDEF_DISCOVERED" ||
action === "android.nfc.action.TECH_DISCOVERED") {
__read(intent);
}
});
}
// 开始扫描
function startScan() {
if (isScanning) return;
isScanning = true;
// 显示扫描界面
document.getElementById('scanContainer').style.display = 'block';
// 显示等待框
waiting = plus.nativeUI.showWaiting("请勿移开标签\n正在读取数据...", {
cancelable: false
});
// 启用NFC前台调度
enableForegroundDispatch();
}
// 取消扫描(通过按钮调用)
function cancelScan() {
if (!isScanning) return;
// 隐藏扫描界面
document.getElementById('scanContainer').style.display = 'none';
// 关闭等待框
if (waiting) {
waiting.close();
waiting = null;
}
// 禁用NFC前台调度
disableForegroundDispatch();
isScanning = false;
console.log("扫描已取消");
}
// 启用NFC前台调度
function enableForegroundDispatch() {
if (!nfcAdapter) return;
var activity = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var PendingIntent = plus.android.importClass("android.app.PendingIntent");
var IntentFilter = plus.android.importClass("android.content.IntentFilter");
var intent = new Intent(activity, activity.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// 注意:在Android 12及以上,需要使用FLAG_MUTABLE
var flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (typeof PendingIntent.FLAG_MUTABLE !== 'undefined') {
flags |= PendingIntent.FLAG_MUTABLE;
}
var pendingIntent = PendingIntent.getActivity(activity, 0, intent, flags);
// 设置接收所有NFC标签
var tagDetected = new IntentFilter("android.nfc.action.TAG_DISCOVERED");
tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
nfcAdapter.enableForegroundDispatch(activity, pendingIntent, [tagDetected], null);
console.log("NFC前台调度已启用");
}
// 禁用NFC前台调度
function disableForegroundDispatch() {
if (!nfcAdapter) return;
var activity = plus.android.runtimeMainActivity();
nfcAdapter.disableForegroundDispatch(activity);
console.log("NFC前台调度已禁用");
}
// 读取NFC标签
function __read(intent) {
try {
if (!isScanning) return;
var NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
var Tag = plus.android.importClass("android.nfc.Tag");
var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
var bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
console.log("NFC标签ID字节数组:", bytesId);
if (!tag) {
throw new Error("未获取到NFC标签");
}
// 处理标签数据
var hexId = bytesToHexString(tag.getId());
console.log("NFC标签ID(HEX): " + hexId);
// 关闭扫描状态
cancelScan();
// 显示扫描结果
plus.nativeUI.alert("扫描成功: " + hexId, function(){
// 回调处理
}, "扫描结果", "确定");
} catch(e) {
console.error("读取NFC标签出错: " + e.message);
cancelScan();
plus.nativeUI.alert("扫描失败: " + e.message);
}
}
// 字节数组转十六进制字符串
function bytesToHexString(bytes) {
if (!bytes) return "";
var hex = [];
for (var i = 0; i < bytes.length; i++) {
var byte = bytes[i] & 0xFF;
hex.push((byte < 16 ? '0' : '') + byte.toString(16));
}
return hex.join(':').toUpperCase();
}
// 初始化
document.addEventListener('plusready', init);
</script>
</head>
<body>
<!-- 扫描状态界面 -->
<div id="scanContainer">
<h2>正在扫描NFC标签</h2>
<p>请将标签靠近设备背面</p>
<button id="cancelBtn" onclick="cancelScan()">取消扫描</button>
</div>
<h1>NFC扫描控制</h1>
<button onclick="startScan()">开始扫描</button>
<p>点击"取消扫描"按钮可中止当前扫描</p>
</body>
</html>
```
### 修正说明
1. **事件监听修正**:
- 使用`plus.globalEvent.addEventListener`替代`activity.addEventListener`
- 在事件回调中,通过`e.intent`创建Intent对象
2. **NFC事件过滤**:
- 添加了NFC事件类型的判断(TAG_DISCOVERED, NDEF_DISCOVERED, TECH_DISCOVERED)
3. **PendingIntent标志更新**:
- 适配Android 12+,使用`FLAG_MUTABLE`(如果可用)
4. **错误处理增强**:
- 在`__read`函数中增加了对tag对象的空值检查
### 注意事项
- 确保在HBuilder中打包为Android应用,并添加NFC权限(在manifest.json中配置)
- 测试设备需要支持NFC功能
§§相关问题§§:
1. 如何在HBuilder应用中配置NFC权限?
2. 如何读取NFC标签中的NDEF消息?
3. 如何向NFC标签写入数据?
4. 如何处理不同NFC标签技术类型(如Mifare Classic, NTAG215等)?</think>### 解决 `Uncaught TypeError: activity.addEventListener is not a function` 错误
这个错误发生在尝试在原生 Android Activity 对象上调用 JavaScript 的 `addEventListener` 方法。在 H5+ 应用中,我们需要使用专门的 `plus.globalEvent` API 来监听原生事件。以下是修正后的完整解决方案:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
<title>NFC扫描控制</title>
<style>
#scanContainer {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.7);
z-index: 1000;
text-align: center;
color: white;
padding-top: 20%;
}
#cancelBtn {
margin-top: 20px;
padding: 15px 30px;
font-size: 18px;
background: #e74c3c;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
</style>
<script>
// 全局状态
var isScanning = false;
var waiting = null;
var nfcAdapter = null;
// 初始化函数
function init() {
// 获取NFC适配器
var activity = plus.android.runtimeMainActivity();
var NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
if (!nfcAdapter) {
console.error("设备不支持NFC");
plus.nativeUI.alert("设备不支持NFC");
return;
}
// 使用全局事件监听newintent - 修正点
plus.globalEvent.addEventListener('newintent', function(e) {
if (!isScanning) return;
// 获取intent对象
var Intent = plus.android.importClass('android.content.Intent');
var intent = new Intent(e.intent);
var action = intent.getAction();
// 过滤掉非NFC的intent
if (action === Intent.ACTION_MAIN) {
return;
}
// 检查是否为NFC事件
if (action === "android.nfc.action.TAG_DISCOVERED" ||
action === "android.nfc.action.NDEF_DISCOVERED" ||
action === "android.nfc.action.TECH_DISCOVERED") {
__read(intent);
}
});
}
// 开始扫描
function startScan() {
if (isScanning) {
plus.nativeUI.toast("已经在扫描中");
return;
}
isScanning = true;
// 显示扫描界面
document.getElementById('scanContainer').style.display = 'block';
// 显示等待框
waiting = plus.nativeUI.showWaiting("请勿移开标签\n正在读取数据...", {
cancelable: false
});
// 启用NFC前台调度
enableForegroundDispatch();
}
// 取消扫描(通过按钮调用)
function cancelScan() {
if (!isScanning) return;
// 隐藏扫描界面
document.getElementById('scanContainer').style.display = 'none';
// 关闭等待框
if (waiting) {
waiting.close();
waiting = null;
}
// 禁用NFC前台调度
disableForegroundDispatch();
isScanning = false;
plus.nativeUI.toast("扫描已取消");
}
// 启用NFC前台调度
function enableForegroundDispatch() {
if (!nfcAdapter) return;
try {
var activity = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var PendingIntent = plus.android.importClass("android.app.PendingIntent");
var IntentFilter = plus.android.importClass("android.content.IntentFilter");
var intent = new Intent(activity, activity.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// 兼容Android 12+的FLAG_MUTABLE
var flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (typeof PendingIntent.FLAG_MUTABLE !== 'undefined') {
flags |= PendingIntent.FLAG_MUTABLE;
}
var pendingIntent = PendingIntent.getActivity(activity, 0, intent, flags);
// 设置接收所有NFC标签
var tagDetected = new IntentFilter("android.nfc.action.TAG_DISCOVERED");
tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
nfcAdapter.enableForegroundDispatch(activity, pendingIntent, [tagDetected], null);
console.log("NFC前台调度已启用");
} catch(e) {
console.error("启用NFC失败: " + e.message);
plus.nativeUI.alert("启用NFC失败: " + e.message);
}
}
// 禁用NFC前台调度
function disableForegroundDispatch() {
if (!nfcAdapter) return;
try {
var activity = plus.android.runtimeMainActivity();
nfcAdapter.disableForegroundDispatch(activity);
console.log("NFC前台调度已禁用");
} catch(e) {
console.error("禁用NFC失败: " + e.message);
}
}
// 读取NFC标签
function __read(intent) {
try {
if (!isScanning) return;
var NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
var Tag = plus.android.importClass("android.nfc.Tag");
var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
var bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
console.log("NFC标签ID字节数组:", bytesId);
if (!tag) {
throw new Error("未获取到NFC标签");
}
// 处理标签数据
var hexId = bytesToHexString(tag.getId());
console.log("NFC标签ID(HEX): " + hexId);
// 关闭扫描状态
cancelScan();
// 显示扫描结果
plus.nativeUI.alert("扫描成功: " + hexId, function(){
// 回调处理
}, "扫描结果", "确定");
} catch(e) {
console.error("读取NFC标签出错: " + e.message);
cancelScan();
plus.nativeUI.alert("扫描失败: " + e.message);
}
}
// 字节数组转十六进制字符串
function bytesToHexString(bytes) {
if (!bytes) return "";
var hex = [];
for (var i = 0; i < bytes.length; i++) {
var byte = bytes[i] & 0xFF;
hex.push((byte < 16 ? '0' : '') + byte.toString(16));
}
return hex.join(':').toUpperCase();
}
// 初始化
document.addEventListener('plusready', function() {
// 添加延迟确保plus对象完全初始化
setTimeout(init, 300);
});
</script>
</head>
<body>
<!-- 扫描状态界面 -->
<div id="scanContainer">
<h2>正在扫描NFC标签</h2>
<p>请将标签靠近设备背面</p>
<button id="cancelBtn" onclick="cancelScan()">取消扫描</button>
</div>
<h1>NFC扫描控制</h1>
<button onclick="startScan()">开始扫描</button>
<p>点击"取消扫描"按钮可中止当前扫描</p>
</body>
</html>
```
### 错误修正说明
#### 1. 事件监听修正
原错误代码:
```javascript
// 错误:activity 是原生对象,没有 addEventListener 方法
activity.addEventListener('newintent', function(e) { ... });
```
修正后代码:
```javascript
// 正确:使用 plus.globalEvent 监听原生事件
plus.globalEvent.addEventListener('newintent', function(e) {
// 从事件对象中获取 intent
var intent = new Intent(e.intent);
...
});
```
#### 2. 关键修正点
1. **事件监听方式**:
- 使用 `plus.globalEvent` 替代原生 Activity 对象
- 从事件参数 `e.intent` 获取 Intent 对象
2. **Intent 处理**:
- 创建新的 Intent 对象:`new Intent(e.intent)`
- 添加 NFC 事件类型过滤
3. **Android 12+ 兼容**:
```javascript
// 使用 FLAG_MUTABLE 兼容 Android 12+
var flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (typeof PendingIntent.FLAG_MUTABLE !== 'undefined') {
flags |= PendingIntent.FLAG_MUTABLE;
}
```
4. **错误处理增强**:
- 添加了更多 try-catch 块
- 增加了 NFC 适配器和标签的空值检查
- 添加用户友好的提示信息
5. **初始化优化**:
```javascript
// 添加延迟确保 plus 对象完全初始化
setTimeout(init, 300);
```
### 使用说明
1. **开始扫描**:点击"开始扫描"按钮
2. **取消扫描**:在扫描界面点击"取消扫描"按钮
3. **扫描结果**:
- 成功:显示标签ID的十六进制字符串
- 失败:显示错误信息
4. **设备要求**:
- Android 设备支持 NFC
- 在 manifest.json 中添加 NFC 权限
### 注意事项
1. **Android 权限**:
```json
// manifest.json
{
"permissions": {
"NFC": {
"description": "NFC权限"
}
}
}
```
2. **设备兼容性**:
- 测试前检查设备是否支持 NFC
- 不同 Android 版本可能有不同行为
3. **调试技巧**:
- 使用 `console.log` 输出关键步骤
- 使用 `plus.nativeUI.toast` 显示状态提示
为什么报错Uncaught TypeError: video.addEventListener is not a function
这个错误通常是因为你尝试给一个非HTML元素添加事件监听器。确保你的video元素已经正确定义并且是HTML元素。
另外,如果你的video元素是使用JS动态创建的,那么你需要等到它被添加到DOM中后再添加事件监听器。可以使用DOMContentLoaded事件来确保DOM已经加载完毕再添加事件监听器。
阅读全文
相关推荐


















