【问题标题】:NPN_Invoke getElementsByTagName Not WorkNPN_Invoke getElementsByTagName 不起作用
【发布时间】:2013-07-25 02:27:22
【问题描述】:

我尝试使用带有 chrome 的 npapi 通过标记名获取 dom 元素,但结果的长度始终为零。

    NPVariant tagName;  
    STRINGZ_TO_NPVARIANT("input", tagName);  
    NPVariant inputCollection;
    if(!NPN_Invoke(m_pNPInstance, doc,NPN_GetStringIdentifier("getElementsByTagName"), &tagName, 1, &inputCollection))
    {
        outLog<<"get input error"<<endl;
    }
    NPVariant npvlength;
    if (NPN_GetProperty(m_pNPInstance, NPVARIANT_TO_OBJECT(inputCollection), NPN_GetStringIdentifier("length"), &npvlength))
    {
        outLog<<npvlength.type<<"," <<npvlength.value.intValue<<endl;
    }

npvlength.value.intValue 始终为 0,但当我尝试获取元素时,它没问题。我可以得到元素和它的属性。

        NPVariant index;
        INT32_TO_NPVARIANT(0, index);

        NPVariant Item;
        if (NPN_Invoke(m_pNPInstance, NPVARIANT_TO_OBJECT(inputCollection), NPN_GetStringIdentifier("item"), &index, 1, &Item))
        {
            NPVariant typeVal;
                if (NPN_GetProperty(m_pNPInstance, NPVARIANT_TO_OBJECT(Item), NPN_GetStringIdentifier("type"), &typeVal))
               {
                   outLog<<NPVARIANT_TO_STRING(typeVal).UTF8Characters<<endl;
               }
        }

【问题讨论】:

    标签: c++ npapi browser-plugin


    【解决方案1】:

    你确定它实际上是NPVariantType_Int32 而不是NPVariantType_Double

    尤其是跨浏览器,您不应该依赖它是其中的一个(不确定它们中的哪一个实际上用于number 值)。而是使用帮助器进行转换,例如:

    bool convertToInt(const NPVariant& v, int32_t& out) {
      if (NPVARIANT_IS_INT32(v)) {
        out = NPVARIANT_TO_INT32(v);
        return true;
      }
    
      if (NPVARIANT_IS_DOUBLE(v)) {
        out = NPVARIANT_TO_DOUBLE(v);
        return true;
      }
    
      // not a numeric variant
      return false;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多