0

我有一个带有 iframe 的 CHtmlDialog。我可以使用 DHTML_EVENT_ONCLICK 宏从放置在顶级 HTML 中的按钮捕获 onClick 事件。但是相同的方法不适用于来自 iframe 中按钮的事件。有没有办法从 iframe 捕获事件?

(顺便说一下,这两个页面都来自资源,它们没有跨域策略问题。)

4

1 回答 1

-2

我不知道对此有适当的解决方案。

我能想到的唯一方法是使用会话 ID 和事件/参数数据从 iframe ping Web 端点,并使用应用程序中的会话 ID 轮询该服务。

我正在考虑在应用程序中托管一个本地 Web 服务器来促进这一点。

编辑 - 我的实现。

我发现的解决方法是让 iFrame 发出虚假的网络请求,并将属性数据附加为 url 参数。然后我在一个线程上侦听本地 DNS 缓存以获取对假域的请求并提取名称值参数。

这是读取 DNS 缓存的片段:

UINT CIFrameListener::ListenerThread(LPVOID pParam)
{
    THREADPARAM* ts = (THREADPARAM*)pParam;
    Util util;
    long startScanTime = util.TimeMS();

    HINSTANCE dnsApiLib = LoadLibraryA("DNSAPI.dll");
    DNS_GET_CACHE_DATA_TABLE dnsGetCacheDataTable = nullptr;
    if(dnsApiLib != nullptr) {
        dnsGetCacheDataTable = (DNS_GET_CACHE_DATA_TABLE)GetProcAddress(dnsApiLib, "DnsGetCacheDataTable");
    }

    while(ts->_this->m_running){
        int dnsIndex = 0;
        // Check DNS 
        DNSCACHEENTRY entry;
        PDNSCACHEENTRY pEntry = &entry;
        dnsGetCacheDataTable(pEntry);
        pEntry = pEntry->pNext;
        while(pEntry != nullptr) {
            size_t len = wcslen(pEntry->pszName);
            CString domain(pEntry->pszName);
            bool allreadyProcessed = false;
            for (int i=0; i<ts->_this->messagesSent.size(); i++){
                if( domain.Compare(ts->_this->messagesSent[i]) == 0){
                    allreadyProcessed = true;
                }
            }
            ts->_this->messagesSent.push_back(domain);
            if(allreadyProcessed == false){
                int end = domain.Find(_T(".infocache.fakedomain.com"));
                if(end != -1){
                    TRACE2(" Domain: %s  %d \n", domain, dnsIndex);
                    int pos = domain.ReverseFind('-'); 
                    if(pos != -1){
                        CString token3 = domain.Mid(pos + 1, end - pos - 1);
                        domain = domain.Mid(0, pos);
                        pos = domain.ReverseFind('-'); 
                        if(pos != -1){
                            CString token2 = domain.Mid(pos + 1, domain.GetLength() - pos - 1);
                            domain = domain.Mid(0, pos);

                            pos = domain.ReverseFind('-');
                            if(pos != -1){
                                CString token1 = domain.Mid(pos + 1, domain.GetLength() - pos - 1);
                                CString token0 = domain.Mid(0, pos);
                                int comp = ts->_this->m_session.Compare(token0);
                                if(comp == 0){
                                    // Notify handler there is a new event.
                                    // notify(token2, token3, token0);
                                }
                            }
                        }
                    }
                    dnsIndex++;
                }
            }
            pEntry = pEntry->pNext;
        }
        Sleep(250);
    }
    return 1;
}
于 2014-02-27T22:39:25.320 回答