草庐IT

javascript - 基于宽度计算的表格列显示和隐藏在 Safari IOS 设备中不起作用

coder 2024-01-23 原文

我正在尝试找出此脚本在某些设备上失败的原因。它可以在 Firefox、Chrome 甚至 IE 浏览器中正常工作,但不能在 Safari IOS 中正常工作。

我在这里使用 iPad 通过 JS Fiddle 测试结果: Example »

HTML 取自 UAT 站点,因此有点粗犷,但我已将其略微缩减。以及从原来的 1000 行中剥离出来的脚本。

用于列计算的 JavaScript:

 $.fn.manageColumns = function () {
    function isVisible () {
        return $(this).css("display") !== "none";
    }
    try {
        var $that = $(this);
        var $parent = $that.closest("form");
        var data = $parent.data("state");
        if (! $.isPlainObject(data)) { data = $parent.attr("data-state"); }
        if (! $.isPlainObject(data)) { throw new TypeError("data-state not an object"); }
        console.log(typeof data);
        if ($.isPlainObject(data)) {
            var groups = data.groups;
            var groupString = "";
            $.each(groups, function (key, value) {
                groupString += "[data-column-group=\"" + value + "\"],";
            });
            if (groupString.length) {
                groupString = groupString.slice(0, -1);
            }
            console.log(groupString);
            var $visible = $that.find(groupString).not(".column-vis");
            var $hidden = $that.find("[data-column-group]").not(".column-vis").not($visible);
            var $all = $that.find("[data-column-all]").not(".column-vis");
            $all.hide();
            $visible.show();
            if ($parent.width() < $that.width()) {
                console.log("Will hide columns to fit screen size");
                var maxIterations = 100;
                var minGroups = 1;
                var group = Number.MAX_VALUE;
                for ( ; ($parent.width() < $that.width()) && (maxIterations > 0) &&
                        (group > minGroups); --maxIterations) {
                    var $nextElem = $that.find("col").filter(isVisible).last();
                    group = parseInt($nextElem.data("column-group"));
                    $that.find("[data-column-group=\"" + group + "\"]").not(".column-vis").hide();
                }
                var span = 0;
                $that.find("col").each(function () {
                    var $vCol = $(this);
                    if ($vCol.isVisible()) {
                        var columnSpan = parseInt($vCol.attr("span"));
                        if (columnSpan <= 0) {
                            columnSpan = 1;
                        }
                        span += parseInt(columnSpan);
                    }
                });
                $all.attr("colspan", span).show();
            }
            else {
                console.log("Don't need to hide columns");
                $all.show();
                $hidden.hide();
                $visible.show();
            }
        }
    }
    catch (e) {
        console.log(e.message);
    }
};

HTML:

<body><div class="test-widget test-table-container"><div class="test-widget-bg"></div><span class="test-icon icon-setup test-icon-corner"></span><p class="test-widget-title">Schedule</p><p class="test-widget-info"></p><div><div><div class="test-table-gutter"><div class="test-table"><form action="javascript:;" autocomplete="off" data-feature-id="54188" data-source-id="a586120c-e3df-44a4-ab21-ef59c9a9f111" data-target-id="56836" data-widget-id="748" enctype="multipart/form-data" method="post"><table class="test-data-table table table-bordered table-hover table-column-control table-active"><colgroup><col class="row-status-color" span="1" /><col class="select-all-rows" span="1" /><col data-column-group="1" span="1" /><col data-column-group="2" span="1" /><col data-column-group="3" span="1" /><col data-column-group="4" span="1" /><col data-column-group="5" span="6" /><col data-column-group="6" span="5" /><col data-column-group="7" span="3" /><col data-column-group="8" span="7" /><col data-column-group="9" span="5" /></colgroup><thead><tr><th colspan="32" data-column-all="all"><div class="col-xs-12 col-sm-9"><div class="test-table-filters test-table-match"><div><div class="test-table-filter" data-filter-id="55f025e2-c68e-4210-a174-e34395a3e5dc"></div></div></div></div><div class="col-xs-12 col-sm-3"><div class="test-table-control test-table-match"><div class="test-auto-key test-control-select"></div><div class="multiselect test-control-select"><div class="select-box"><ul class="form-control"><li>Columns</li></ul><div class="checkboxes-over-select"></div></div><div class="checkboxes"><label for="2fba68e2-7d23-46bb-b340-075ef549b51f"><input checked="checked" class="column-vis" data-column-group="1" id="2fba68e2-7d23-46bb-b340-075ef549b51f" type="checkbox" />Name</label><label for="85f5631d-4fa2-4708-9001-075d67104ec6"><input checked="checked" class="column-vis" data-column-group="2" id="85f5631d-4fa2-4708-9001-075d67104ec6" type="checkbox" />Zone</label><label for="0a1e4226-4402-47ec-ae98-426ee767a4ed"><input checked="checked" class="column-vis" data-column-group="3" id="0a1e4226-4402-47ec-ae98-426ee767a4ed" type="checkbox" />Status</label><label for="47ebdbde-3f49-4d40-a855-d27b82865c50"><input checked="checked" class="column-vis" data-column-group="4" id="47ebdbde-3f49-4d40-a855-d27b82865c50" type="checkbox" />Roamable</label><label for="f70ceb61-1b6f-41cd-b251-5735dc7bd6b6"><input checked="checked" class="column-vis" data-column-group="5" id="f70ceb61-1b6f-41cd-b251-5735dc7bd6b6" type="checkbox" />Schedule</label><label for="2ef942c6-af71-4c00-ac95-0d87d443b8fd"><input checked="checked" class="column-vis" data-column-group="6" id="2ef942c6-af71-4c00-ac95-0d87d443b8fd" type="checkbox" />Authentication</label><label for="8ff2a2c5-5c1f-4ff7-bb99-95adfa20fe04"><input checked="checked" class="column-vis" data-column-group="7" id="8ff2a2c5-5c1f-4ff7-bb99-95adfa20fe04" type="checkbox" />Device</label><label for="babda357-ae2e-41fe-8434-4bf43a969c6d"><input checked="checked" class="column-vis" data-column-group="8" id="babda357-ae2e-41fe-8434-4bf43a969c6d" type="checkbox" />Vanity</label><label for="ca231149-ec2b-4235-b797-5616461190d7"><input checked="checked" class="column-vis" data-column-group="9" id="ca231149-ec2b-4235-b797-5616461190d7" type="checkbox" />Traffic</label></div></div><div class="test-row-count test-control-select"></div></div></div><div class="col-xs-12 test-attached-filters"></div></th></tr><tr class="column-grouping"><th class="row-status-color"></th><th></th><th colspan="1" data-column-group="1"></th><th colspan="1" data-column-group="2"></th><th colspan="1" data-column-group="3"></th><th colspan="1" data-column-group="4"></th><th colspan="6" data-column-group="5" style="background:rgb(109, 56, 107); color:#FFF;">Schedule</th><th colspan="5" data-column-group="6" style="background:rgb(204, 155, 56); color:#FFF;">Authentication</th><th colspan="3" data-column-group="7" style="background:rgb(192, 105, 119); color:#FFF;">Device</th><th colspan="7" data-column-group="8" style="background:rgb(150, 150, 116); color:#FFF;">Vanity</th><th class="last" colspan="5" data-column-group="9" style="background:rgb(138, 126, 149); color:#FFF;">Traffic</th></tr><tr class="column-headers"><th class="row-status-color"></th><th class="select-all-rows"><input class="check-all-rows" type="checkbox" /></th><th class="column-sortable check-active" data-column-group="1" data-source-id="49421">Name</th><th class="column-sortable check-active" data-column-group="2" data-source-id="56844">Zone</th><th class="column-sortable check-active" data-column-group="3" data-source-id="49426">Status</th><th class="column-sortable check-active" data-column-group="4" data-source-id="49427">Roamable</th><th class="column-sortable check-active" data-column-group="5" data-source-id="56841">Recurrence</th><th class="column-sortable check-active" data-column-group="5" data-source-id="56842">Limit</th><th class="column-sortable check-active" data-column-group="5" data-direction="ascending" data-source-id="49424">From</th><th class="column-sortable check-active" data-column-group="5" data-source-id="49425">Until</th><th class="column-sortable check-active" data-column-group="5" data-source-id="56852">Preparation Period</th><th class="column-sortable check-active" data-column-group="5" data-source-id="56853">Cleanup Period</th><th class="column-sortable check-active" data-column-group="6" data-source-id="56855">Default Access Code</th><th class="column-sortable check-active" data-column-group="6" data-source-id="56856">Bandwidth</th><th class="column-sortable check-active" data-column-group="6" data-source-id="56857">Priority Access Code</th><th class="column-sortable check-active" data-column-group="6" data-source-id="56858">Bandwidth</th><th class="column-sortable check-active" data-column-group="6" data-source-id="49431">Alert Threshold</th><th class="column-sortable check-active" data-column-group="7" data-source-id="49432">Limit</th><th class="column-sortable check-active" data-column-group="7" data-source-id="49434">Alert Threshold</th><th class="column-sortable check-active" data-column-group="7" data-source-id="49433">Currently Active</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56849">SSID</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56851">SSID Grace Period</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56850">Hide</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56846">Encryption</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56847">Protocol</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56848">Key</th><th class="column-sortable check-active" data-column-group="8" data-source-id="56845">VLAN</th><th class="column-sortable check-active" data-column-group="9" data-source-id="49438">Upload</th><th class="column-sortable check-active" data-column-group="9" data-source-id="49440">Packets</th><th class="column-sortable check-active" data-column-group="9" data-source-id="49439">Download</th><th class="column-sortable check-active" data-column-group="9" data-source-id="49441">Packets</th><th class="column-sortable check-active" data-column-group="9" data-source-id="49437">Logging</th></tr></thead><tbody><tr class="data-row" data-anch-target="28"><td class="row-status-color" style="background: rgb(109, 56, 107)"></td><td class="selecting"><input class="check" type="checkbox" value="28" /></td><td class="expand bold" data-column-group="1">Test</td><td class="expand" data-column-group="2">Guest</td><td class="expand" data-column-group="3">Active</td><td class="expand" data-column-group="4"><span class="icon-no"></span></td><td class="expand" data-column-group="5">Once</td><td class="expand" data-column-group="5">0</td><td class="expand" data-column-group="5">2016-03-08 00:00:00</td><td class="expand" data-column-group="5">2016-03-09 18:00:00</td><td class="expand" data-column-group="5">01:00:00</td><td class="expand" data-column-group="5">01:00:00</td><td class="expand" data-column-group="6">standard</td><td class="expand" data-column-group="6">Regular Speed Conference</td><td class="expand" data-column-group="6">best</td><td class="expand" data-column-group="6">Complimentary Low Speed (Lobby)</td><td class="expand" data-column-group="6">90</td><td class="expand" data-column-group="7">3</td><td class="expand" data-column-group="7">70</td><td class="expand" data-column-group="7">0</td><td class="expand" data-column-group="8">UAT_Test_SSID</td><td class="expand" data-column-group="8">00:30:00</td><td class="expand" data-column-group="8"><span class="icon-no"></span></td><td class="expand" data-column-group="8">None</td><td class="expand" data-column-group="8">WPA_CCMP</td><td class="expand" data-column-group="8"></td><td class="expand" data-column-group="8">UAT_CONFERENCE</td><td class="expand" data-column-group="9">0</td><td class="expand" data-column-group="9">0</td><td class="expand" data-column-group="9">0</td><td class="expand" data-column-group="9">0</td><td class="expand" data-column-group="9"><span class="icon-no"></span></td></tr></tbody></table></form></div></div></div></div></div></body>

如果您在 JS Fiddle 示例中展开窗口,您将看到根据屏幕宽度隐藏和显示的列。

我知道它的边缘有点粗糙,但我们将不胜感激。

最佳答案

bootstrap 将 100% 分配为表格宽度和表格最大宽度,因此在 Safari 中您的 if ($parent.width() < $that.width())不起作用,因为 that table 和 window 一样大,而不是更多。

只需添加

.table {
    width: intrinsic;
    max-width:intrinsic;
}

到你的CSS,你就完成了

关于javascript - 基于宽度计算的表格列显示和隐藏在 Safari IOS 设备中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35918324/

有关javascript - 基于宽度计算的表格列显示和隐藏在 Safari IOS 设备中不起作用的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  6. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  7. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  8. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  9. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  10. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

随机推荐