Хобрук: Ваш путь к мастерству в программировании

CDhtmlDialog: как перехватить событие из iframe?

У меня есть CHtmlDialog с iframe. Я могу захватить событие onClick с кнопки, размещенной в HTML верхнего уровня, с помощью макроса DHTML_EVENT_ONCLICK. Но тот же метод не работает с событием от кнопки, размещенной в iframe. Есть ли способ захватывать события из iframe?

(Кстати, обе страницы исходят из ресурса, и у них нет проблем с междоменной политикой.)


Ответы:


1

Я не знаю правильного решения для этого.

Единственный способ, которым я могу придумать, чтобы заставить это работать, - это пропинговать конечную точку сети из iframe, используя идентификатор сеанса вместе с данными события/параметра, и опросить эту службу, используя идентификатор сеанса из приложения.

Я рассматриваю возможность размещения локального веб-сервера в приложении, чтобы облегчить это.

Изменить — Моя реализация.

Обходной путь, который я нашел, заключался в том, чтобы 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;
}
27.02.2014
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...