нахождение элементов с текстом с помощью jQuery

Принятый ответ не работает на iOS 10. Я нашел обходной путь и установил таймер в AppDelegate, который проверяет свойство currentRadioAccessTechnology каждые 5 секунд. Поэтому нам также нужна функция для проверки наличия беспроводного соединения вместо технологии радиодоступа.

Проверьте, доступно ли WIFI-соединение:

class func isConnectedToWlan() -> Bool {
    var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, 
                         sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        [110].withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
        }
    }

    var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
    if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
        return false
    }

    //Only Working for WIFI
     let isReachable = flags == .reachable
     let needsConnection = flags == .connectionRequired

     return isReachable && !needsConnection
}

Установите таймер следующим образом:

Timer.scheduledTimer(timeInterval: TimeInterval.seconds(5.0), target: self, selector:      
                           #selector(showNetworkMessage), userInfo: nil, repeats: true)

Селектор, который вызывается каждые 5 секунд:

    guard !Reachability.isConnecteToWlan() else {
        //Connected to WLAN
        return
    }
    guard let currentRadioAccessTechnology = info.currentRadioAccessTechnology else {
        // No internet connection
        return
    }
    guard (currentRadioAccessTechnology == CTRadioAccessTechnologyGPRS 
             || currentRadioAccessTechnology == CTRadioAccessTechnologyEdge) else {
        // 3G, LTE fast radio access Technology
        return
    }

    if lastRadioAccessTechnology != nil {
        guard let lastRadioAccessTechnology = lastRadioAccessTechnology, 
            (lastInfo != currentRadioAccessTechnology || 
              lastInfo != currentRadioAccessTechnology) else {
            //Internet connection did not change
            return
        }
    }
    // Internet connection changed to Edge or GPRS
    // Store lastRadioAccessTechnology to check if internet connection changed
    lastRadioAccessTechnology = currentRadioAccessTechnology
8
задан Tim Sheiner 19 June 2009 в 16:24
поделиться

8 ответов

$("#my_div *").filter(function()
{
     var $this = $(this);
     return $this.children().length == 0 && $.trim($this.text()).length > 0;
})

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

Может быть не самым быстрым, но довольно хорошо работает на домашней странице StackOverflow :)

10
ответ дан 5 December 2019 в 08:00
поделиться

Пользовательский селектор может быть полезен в вашем случае:

jQuery.expr[':'].hasText = function(element, index) {
     // if there is only one child, and it is a text node
     if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) {
        return jQuery.trim(element.innerHTML).length > 0;
     }
     return false;
};

После этого вы можете просто сделать это:

$('#someDiv :hasText') // will contain all elements with text nodes (jQuery object)
$('#someDiv :hasText').get() // will return a regular array of plain DOM objects

Я предполагаю, что вы пытаетесь выбрать только элементы, содержащие ТОЛЬКО текст внутри них.

7
ответ дан 5 December 2019 в 08:00
поделиться

Вы можете использовать not, а пустые селекторы для получения непустых элементов, а преобразование в массив может быть достигнуто с помощью get

$("#theDiv > :not(:empty)").get();

Вышеупомянутый селектор получает все дочерние элементы " theDiv "и которые не являются пустыми (т.е. у них есть дочерние элементы или текст), а затем преобразует согласованный набор в массив.

Если вам нужны только элементы, внутри которых есть текст, это должно сработать ...

$("#theDiv > :not(:empty, :has(*))").get();

Чтобы избавиться от элементов с пробелами, вы можете использовать фильтр

$("#theDiv > :not(:has(*))").filter(function() { 
                 return $.trim(this.innerHTML).length > 0;
         }).get();
2
ответ дан 5 December 2019 в 08:00
поделиться

Вы можете циклически перебрать дочерние элементы и получить все, что имеет значение .text () ! = ""

1
ответ дан 5 December 2019 в 08:00
поделиться
var array = [];
var divSelector = "div.mine";

$(divSelector).contents().each(function()
{
   // If not an element, go to next node.
   if (this.nodeType != 1) return true;       

   var element = $(this);
   if ($.trim(element.text()) != "")
     array.push(element);
});

array - это массив элементов, содержащих некоторый текст.

1
ответ дан 5 December 2019 в 08:00
поделиться
 $(function() {
        var array = new Array();
        $("#testDiv *").each(function(x, el) {

            if ($.trim($(el).text()) != '' ) {
                array.push(el);
            }
        });
        alert(array.length);
    });
0
ответ дан 5 December 2019 в 08:00
поделиться

d - это div, в котором вы хотите найти вещи
v - пустой массив
i вам нужно начать с 0.

$ .trim используется для того, чтобы вы не получали узлы, состоящие только из пробелов.

$("*",d).filter( function() { 
     return $.trim($(this).text()) != ""
  } ).each( function() { 
     v[i] = $(this).text(); 
     i++; 
  } );

Также можно использовать v.push ($ (this)) ... это то, что совершенно вылетело у меня из головы.

0
ответ дан 5 December 2019 в 08:00
поделиться

Используйте селектор: contains:

var matches = new Array();
$('#start_point *:contains(' + text + ')').each(function(i, item) {
 matches.push( item );
}
0
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: