SCRIPT438: 对象不支持该属性或方法 IE

63

我的应用程序有一个选项,允许用户停用他们的个人资料。只有管理员才能再次激活它们。

我有一个名为ActivateProfile的类,其中有两个方法:

  • userExist(userName):检查是否存在具有该用户名的用户,以及其个人资料是否已停用
  • activateAccountByUser(userName):重新激活用户的个人资料

在输入按钮的单击事件上调用JavaScript函数。 这段代码在Chrome和Mozilla上运行良好,但在Internet Explorer上出现此错误:

SCRIPT438: 对象不支持“userExist”属性或方法

function activateProf() {        
   var userName=document.getElementById("userName").value;

   if (userName == "") {
      alert("Полето е задолжително");
   } else {
      alert(userName + "1");
      ActivateProfile.userExist(userName, { callback:function(exist) {
         if (userName) {
            ActivateProfile.activateAccountByUser(userName);
            alert("User is activated");
         } else {
            alert("User does not exist");
         }
      }});
   }
}

这里是激活个人资料类的代码

 public void activateAccountByUser(String userName) {
    try {
        Connection c = DBComm.getInstance().getConnection();
        Statement s = c.createStatement();
        ResultSet set = s.executeQuery("select * from accounts where userName = '" + userName + "' and isauthorized='2'");

        if (set.next()) {
            Statement st = c.createStatement();
            st.executeUpdate("update accounts set isauthorized='1' where userName='" + userName                    + "' and isauthorized='2'");
        }
        s.close();
        c.close();
    } catch (Exception ex) {
        java.util.logging.Logger.getLogger(ActivateProfile.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public boolean userExist(String userName) throws SQLException {
    //true exist
    //false does not exist
    boolean existEmbg = false;

    try {
        Connection c = DBComm.getInstance().getConnection();
        Statement s = c.createStatement();
        ResultSet set = s.executeQuery("select * from accounts where userName = '" + userName + "' and isauthorized='2'");

        if (set.next()) {
            existEmbg = true;
        } else {
            existEmbg = false;
        }
        s.close();
        c.close();
    } catch (Exception ex) {
       java.util.logging.Logger.getLogger(ActivateProfile.class.getName()).log(Level.SEVERE, null, ex);
    }
    return existEmbg;
}

1
接受了16个问题中的2个? - Aleks G
请尝试发布您的 ActivateProfile 类。 - joeyramone76
10个回答

90

在搜索了几天互联网后,我发现当HTML元素的ID与JavaScript函数中的某个变量具有相同的ID时,通常会发生这种错误。更改它们中的一个名称后,我的代码就可以正常工作了。


12
如何在大型代码库中找到命名冲突的任何提示? - Kozuch
3
寻找冲突的解决方案:https://dev59.com/OHbZa4cB1Zd3GeqPBxhQ,http://unix.stackexchange.com/questions/110645/select-lines-from-text-file-which-have-ids-listed-in-another-file或https://dev59.com/JEbRa4cB1Zd3GeqP4-wp。 - Kozuch
我认为命名冲突不是根本原因。这种情况发生在我的JavaScript对象中花括号放错位置。当我调用该对象时,由于语法错误,它不存在。所以,我认为浏览器做了下一个最好的事情,并获取了相同名称的DOM元素。我通过正确使用JavaScript花括号来修复它,而不是重命名我的JavaScript对象。 - Tom McDonald
在一个理智的世界中,下一个最好的事情就是指出错误。 - symbiont

8

这是Web应用程序中常见的问题,该应用程序采用JavaScript命名空间。在这种情况下,99.9%的问题是IE不能将当前命名空间内的方法绑定到“this”关键字。

例如,如果我有JS命名空间“StackOverflow”和方法“isAwesome”。通常,如果您在“StackOverflow”命名空间中,您可以使用以下语法调用“isAwesome”方法:

this.isAwesome();

Chrome、Firefox和Opera都可以使用这种语法。但是IE不行。因此,在使用JS命名空间时,最安全的做法是始终使用实际命名空间作为前缀。如下:

StackOverflow.isAwesome();

我认为那不正确...有没有Chrome会绑定到“命名空间”但IE不会的实例? - Jeremy
嗨,Jeremy!我不确定你的意思,请详细说明一下? - pim

5

我已经为相应的JavaScript中的所有变量添加了var。这解决了IE中的问题。

以前的代码

billableStatus = 1 ;
var classStr = $(this).attr("id").split("_");  
date = currentWeekDates[classStr[2]]; // Required    

activityNameId = "initialRows_" + classStr[1] + "_projectActivityName";
activityId = $("#"+activityNameId).val();        

var projectNameId = "initialRows_" + classStr[1] + "_projectName" ;
projectName = $("#"+projectNameId).val();        

var timeshitEntryId = "initialRows_"+classStr[1]+"_"+classStr[2];     
timeshitEntry = $("#"+timeshitEntryId).val();   

新代码

var billableStatus = 1 ;
var classStr = $(this).attr("id").split("_");  
var date = currentWeekDates[classStr[2]]; // Required    

var activityNameId = "initialRows_" + classStr[1] + "_projectActivityName";
var activityId = $("#"+activityNameId).val();        

var projectNameId = "initialRows_" + classStr[1] + "_projectName" ;
var projectName = $("#"+projectNameId).val();        

var timeshitEntryId = "initialRows_"+classStr[1]+"_"+classStr[2];     
var timeshitEntry = $("#"+timeshitEntryId).val();   

使用 var 关键字本地化变量解决了将变量命名为元素 id 相同的问题 - 做得好。 - MuffinTheMan

2

我的问题在于在jQuery的<script>标签上使用了type="application/javascript"。IE8不支持这个!如果你的网页是HTML5,你甚至不需要声明类型,否则请改用type="text/javascript"


1
在我的情况下,我有这样的代码:
function.call(context, arg);

我在IE下收到了错误信息

类型错误:对象不支持属性或方法“error”

在“function”的主体中,我使用了“console.error”,结果发现当您的控制台关闭时,控制台对象未定义。我通过检查控制台和控制台错误是否已定义来修复了此问题。


0

我忘记在我的item变量上使用var

错误的代码:

var itemCreateInfo = new SP.ListItemCreationInformation();
item = list.addItem(itemCreateInfo); 
item.set_item('Title', 'Haytham - Oil Eng'); 

正确的代码:
var itemCreateInfo = new SP.ListItemCreationInformation();
var item = list.addItem(itemCreateInfo);  
item.set_item('Title', 'Haytham - Oil Eng');

0

0

在所有的脚本标签中实现"use strict",以查找不一致性并修复潜在的未定义变量!


-1

这个问题可能是由于不当的jQuery版本引起的,例如1.4等不支持done方法的版本。


-1

我有以下内容

document.getElementById("search-button") != null

这段程序在除了IE8以外的所有浏览器中都能正常工作。(我没有检查IE6或IE7)

我对其进行了修改,改为:

document.getElementById("searchBtn") != null

并且在我的HTML中更新了字段的id属性,现在在ie8中可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接